/// TNodeNet::TNodeI::GetInNId
Range of NodeN: 0 <= NodeN < GetInDeg().
///

/// TNodeNet::TNodeI::GetOutNId
Range of NodeN: 0 <= NodeN < GetOutDeg().
///

/// TNodeNet::TNodeI::GetNbrNId
Range of NodeN: 0 <= NodeN < GetNbrDeg().
///

/// TNodeNet::AddNode (int NId = -1)
Returns the ID of the node being added.
If NId is -1, node ID is automatically assigned.
Aborts, if a node with ID NId already exists.
///

/// TNodeNet::AddNode-1 (int NId, const TNodeData& NodeDat)
Returns the ID of the node being added.
If NId is -1, node ID is automatically assigned.
Aborts, if a node with ID NId already exists.
///

/// TNodeNet::DelNode
If the node of ID NId does not exist the function aborts.
///

/// TNodeNet::AddEdge
If the edge already exists return -2. If the edge was successfully added
return -1.
Normally the function should return an ID of the edge added but since edges in
TNodeNet have no IDs we return -1.
Function aborts if SrcNId or DstNId are not nodes in the network.
///

/// TNodeNet::DelEdge
If the edge (SrcNId, DstNId) does not exist in the network function still
completes.
But the function aborts if SrcNId or DstNId are not nodes in the network.
///

/// TNodeNet::Defrag
After performing many node and edge insertions and deletions to a network,
the network data structure will be fragmented in memory.
This function compacts down the network data structure and frees unneeded
memory.
///

/// TNodeNet::IsOk
For each node in the network check that its neighbors are also nodes in the
network.
///

/// TNodeEDatNet::TNodeI::GetInNId
Range of NodeN: 0 <= NodeN < GetInDeg().
///

/// TNodeEDatNet::TNodeI::GetOutNId
Range of NodeN: 0 <= NodeN < GetOutDeg().
///

/// TNodeEDatNet::TNodeI::GetNbrNId
Range of NodeN: 0 <= NodeN < GetNbrDeg().
///

/// TNodeEDatNet::AddNode (int NId = -1)
Returns the ID of the node being added.
If NId is -1, node ID is automatically assigned.
Aborts, if a node with ID NId already exists.
///

/// TNodeEDatNet::AddNode-1 (int NId, const TNodeData& NodeDat)
Returns the ID of the node being added.
If NId is -1, node ID is automatically assigned.
Aborts, if a node with ID NId already exists.
///

/// TNodeEDatNet::DelNode
If the node of ID NId does not exist the function aborts.
///

/// TNodeEDatNet::AddEdge (const int& SrcNId, const int& DstNId)
If the edge already exists return -2.
If the edge does not exist and was successfully added return -1.
Normally the function should return an ID of the edge added but since edges in
TNodeEDatNet have no IDs we return -1.
Function aborts if SrcNId or DstNId are not nodes in the network.
///

/// TNodeEDatNet::AddEdge-1 (const int& SrcNId, const int& DstNId, const TEdgeData& EdgeData)
If the edge already exists, set edges data and returns -2.
If the edge does not exist and was successfully added returns -1.
Normally the function should return an ID of the edge added but since edges in
TNodeEDatNet have no IDs it returns -1.
Function aborts if SrcNId or DstNId are not nodes in the network.
///

/// TNodeEDatNet::DelEdge
If the edge (SrcNId, DstNId) does not exist in the network function still
completes.
But the function aborts if SrcNId or DstNId are not nodes in the network.
///

/// TNodeEDatNet::GetEDat (const int& SrcNId, const int& DstNId, TEdgeData& Data)
Returns true, if the edge was found. Otherwise, returns false.
///

/// TNodeEDatNet::Defrag
After performing many node and edge insertions and deletions to a network,
the network data structure will be fragmented in memory.
This function compacts down the network data structure and frees unneeded
memory.
///

/// TNodeEDatNet::IsOk
For each node in the network check that its neighbors are also nodes in the
network.
///

/// TNodeEdgeNet::TNodeI::GetInNId
Range of NodeN: 0 <= NodeN < GetInDeg().
///

/// TNodeEdgeNet::TNodeI::GetOutNId
Range of NodeN: 0 <= NodeN < GetOutDeg().
///

/// TNodeEdgeNet::TNodeI::GetNbrNId
Range of NodeN: 0 <= NodeN < GetNbrDeg().
///

/// TNodeEdgeNet::AddNode (int NId = -1)
Returns the ID of the node being added.
If NId is -1, node ID is automatically assigned.
Aborts, if a node with ID NId already exists.
///

/// TNodeEdgeNet::AddNode-1 (int NId, const TNodeData& NodeDat)
Returns the ID of the node being added.
If NId is -1, node ID is automatically assigned.
Aborts, if a node with ID NId already exists.
///

/// TNodeEdgeNet::DelNode
If the node of ID NId does not exist the function aborts.
///

/// TNodeEdgeNet::AddEdge (const int& SrcNId, const int& DstNId, int EId = -1)
Returns the ID of the edge being added.
If EId is -1, edge ID is automatically assigned.
Aborts, if an edge with ID EId already exists.
Aborts, if SrcNId or DstNId are not nodes in the graph.
///

/// TNodeEdgeNet::AddEdge-1 (const int& SrcNId, const int& DstNId, int EId, const TEdgeData& EdgeDat);
Returns the ID of the edge being added.
If EId is -1, edge ID is automatically assigned.
Aborts, if an edge with ID EId already exists.
Aborts, if SrcNId or DstNId are not nodes in the graph.
///

/// TNodeEdgeNet::DelEdge
If the edge (SrcNId, DstNId) does not exist in the network function still
completes.
But the function aborts if SrcNId or DstNId are not nodes in the network.
///

/// TNodeEdgeNet::Defrag
After performing many node and edge insertions and deletions to a network,
the network data structure will be fragmented in memory.
This function compacts down the network data structure and frees unneeded
memory.
///

/// TNodeEdgeNet::IsOk
For each node in the network check that its neighbors are also nodes in the
network.
///

/// TNEANet::Class
Node IDs can be arbitrary non-negative integers. Edges have IDs.
There can be more than one directed edge from one source node to a destination
node.
Self loops (one per node) are allowed as well as multiple (parallel) edges.
Nodes and edges can have attributes/data associated with them.
The attributes can be added dynamically at runtime.
The directed multigraph data structure is implemented using sorted adjacency
lists.
This means adding a node takes constant time, while adding an edge takes
linear time (since adjacency list is kept sorted) in the node degree.
Accessing arbitrary node takes constant time and accessing any edge takes
logarithmic time in the node degree.
The attributes are organized in a columnar store, where each attribute column
is defined for all the nodes or edges in the network.
///

/// TNEANet::TNodeI::GetInNId
Range of NodeN: 0 <= NodeN < GetInDeg().
///

/// TNEANet::TNodeI::GetOutNId 
Range of NodeN: 0 <= NodeN < GetOutDeg().
/// 
    
/// TNEANet::TNodeI::GetNbrNId 
Range of NodeN: 0 <= NodeN < GetNbrDeg().
///

/// TNEANet::New
Call: PNEANet Graph = TNEANet::New(Nodes, Edges).
///
    
/// TNEANet::AddNode (int NId = -1)
Returns the ID of the node being added.
If NId is -1, node ID is automatically assigned.
Aborts, if a node with ID NId already exists.
/// 

/// TNEANet::DelNode
If the node of ID NId does not exist the function aborts.
///

/// TNEANet::AddEdge
Returns the ID of the edge being added.
If EId is -1, edge ID is automatically assigned.
Aborts, if an edge with ID EId already exists.
Aborts, if SrcNId or DstNId are not nodes in the graph.
///

/// TNEANet::DelEdge
If the edge (SrcNId, DstNId) does not exist in the graph function still
completes.
But the function aborts if SrcNId or DstNId are not nodes in the graph.
///

/// TNEANet::Defrag
After performing many node and edge insertions and deletions to a graph,
the graph data structure will be fragmented in memory.
This function compacts down the graph data structure and frees unneeded
memory.
///

/// TNEANet::IsOk
For each node in the graph check that its neighbors are also nodes in the
graph.
///

/// TNEANet::AddIntAttrDatN
Adds the key int value pair to the corresponding node attribute value vector.
///

/// TNEANet::AddStrAttrDatN
Adds the key str value pair to the corresponding node attribute value vector.
///

/// TNEANet::AddFltAttrDatN
Adds the key flt value pair to the corresponding node attribute value vector.
///

/// TNEANet::AddIntAttrDatE
Adds the key int value pair to the corresponding edge attribute value vector.
///

/// TNEANet::AddStrAttrDatE
Adds the key str value pair to the corresponding edge attribute value vector.
///

/// TNEANet::AddFltAttrDatE
Adds the key flt value pair to the corresponding edge attribute value vector.
///

/// TNEANet::GetSmallGraph
\verbatim
Edges:  0 -> 1, 0 -> 2, 0 -> 3, 0 -> 4, 1 -> 2, 1 -> 2
\endverbatim
///


