Scippy

SCIP

Solving Constraint Integer Programs

Detailed Description

Methods for detecting network (sub)matrices.

Author
Rolf van der Hulst

Detecting if a matrix is a network matrix can be quite complex. Below is an introductory text, which may help with navigating the functions and datastructures in this file by giving a general overview. More details can be found in; R.P. van der Hulst and M. Walter "A row-wise algorithm for graph realization" and R.E. Bixby and D.K. Wagner "An almost linear-time algorithm for graph realization" for the column-wise algorithm.

The main difficulty with detecting network matrices is that there may exist many pairs of a graph and a spanning tree that realize a matrix. The ambiguity of these graphs may be characterized in terms of \(k\)-separations on the graph associated to the network matrix. An edge partition \((E_1,E_2)\) is considered a \(k\)-separation if \(|E_i|\geq k \) holds for \(i\in\{1,2\}\). The ambiguity of network matrices is completely given by all the 1-separations and 2-separations of the associated graph(s). In particular, if the graph realizing a network matrix is 3-connected, then it is unique, up to inverting all edges of the graph.

A 1-separation given by edge sets \((E_1,E_2)\), which is given by a singular node that is referred to as an articulation node, implies that no column of the network matrix contains edges in both \(E_1\) and \(E_2\). Remember that each edge in a realizing graph is associated with a row or column of the network matrix. Then, we have a 1-separation exactly when the network matrix contains two (or more) disconnected blocks, where the rows and columns of each block are contained in either \(E_1\) or \(E_2\). To obtain a graph realizing our network matrix, we can attach the graph realizing \(E_2\) at any node of the graph realizing \(E_1\). Thus, we store the graphs corresponding to the connected blocks of the network matrix separately. Each block has a 2-connected realization graph.

If a graph \(G\) realizing the network matrix has a 2-separation \((E_1,E_2)\) at vertices u and v, then we can obtain another graph representing the network matrix, by inverting the direction of all edges in \(E_2\) and replacing u by v and vice-versa. One can also imagine adding a virtual edge \(e'=\{u,v\}\) to both E_1 and E_2. In the trivial realization, we simply map the head of \(e'\) in \(E_1\) to the head of \(e'\) in \(E_2\) and remove \(e'\) from both graphs. In the second realization we do the same thing, but first invert all the edges in \(E_2\), including \(e'\). An SPQR tree \(\mathcal{T}=(\mathcal{V},\mathcal{E})\) is a tree data structure that represents the structure of all 2-separations in a 2-connected graph. Each member \(\nu\in\mathcal{V}\) has an associated skeleton graph that has one of four different types:

  • (S) The member's skeleton graph is a cycle with at least 3 edges (also referred to as series or polygon)
  • (P) The member's skeleton graph consists of at least 3 parallel edges and 2 nodes (also referred to as bond)
  • (Q) The member's skeleton graph consists of at most 2 edges connecting two nodes (also referred to as loop)
  • (R) The member's skeleton graph is 3-connected and consists of at least 4 edges.

An SPQR tree is considered minimal if it has no P-P or S-S connections. Each connected matrix has a unique minimal SPQR tree. Each edge \(\{\nu,\mu\}\in\mathcal{E}\) defines a 2-separation of the underlying graph. In particular, each edge has one virtual edge in the member graph that it connects to the other member graph in the edge.

We can obtain a realization of the graph underlying the network matrix by doing the following operations:

  1. Permute the edges of each (S)-member arbitrarily
  2. For each edge in \(\mathcal{E}\), pick one of the two orientations of the virtual edges and merge the adjacent member graphs accordingly.

In this way, all the graphs given by the network matrix are represented. In order to efficiently perform the merge of two member graphs, the member and node labels are given by union-find datastructures. Additionally, we also introduce a signed-union-find datastructure on the arcs of the graphs, so that we can efficiently invert the arcs of one side of a 2-separation. The 1-separations can be handled by storing an SPQR forest, with a (minimal) SPQR tree for every connected block of the network matrix.

For adding a column to the network matrix, one can show that one can add a column only if the nonzeros of the column form a path with the correct signs in some graph represented by the network matrix. We solve the problem for each graph represented by the network matrix simultaneously by decomposing over the SPQR tree. First, we compute the path in each member. Then, we attempt to combine the paths by orienting the 2-separations so that the different member paths form a path in the represented graph. If some member has a set of edges that do not form a path, we can terminate. An important step is 'propagation'; when we are in a leaf node of the sub-SPQR tree containing path edges and the path in our leaf node forms a cycle with the virtual arc e connecting to the rest of the sub-tree, then we can remove the leaf node from the SPQR tree and mark the virtual arc f that is paired with e. After performing all such propagations, the sub-SPQR tree should form a path. Then, we merge these members into one, forming a single path. By adding the new column edge to the end nodes of this path, we form a new member of type R. Finally, we can easily join the paths of multiple SPQR trees using a series node to obtain the final path.

The ideas for the row-wise algorithm have many parallels with the column-wise algorithm. One can add a row to a network matrix if and only if a node is 'splittable' with respect to a certain auxiliary graph formed by the nonzero columns indices of the row, for a graph represented by the network matrix. In particular, this auxiliary graph must be a directed bipartite graph; then, the arcs incident to the given node can be reassigned to two new nodes, so that the paths of the columns corresponding to the nonzeros of the row can be elongated to contain the new row, which is placed between the two new nodes. Similarly to the column-case, splittability of each graph represented by the network matrix can be computed at once by computing the splittability (and the corresponding bipartition) of every member graph. Similarly to the column algorithm, we can propagate; If a member is a leaf of the SPQR tree and both nodes of the 2-separation connecting it to the rest of graph are splittable, then we can remove the leaf from the reduced SPQR tree and mark the virtual edge connecting to the subtree. Finally, we are left with some minimal subtree with splittable vertices for each member graph. If we can merge all splittable vertices of the member graphs in the subtree into a single splittable vertex, then we perform this merge, and split this vertex. This yields us a new, larger node of type R (rigid).

Implementation notes:

  1. Quite a few algorithms used for network matrix detection are recursive in nature. However, recursive calls can cause stack overflows, particularly with large graphs. Quite frequently in the code, we need to allocate the call-data of these algorithms on the heap, instead, and use while loops to simulate the recursion.
  2. In order to make the code fast in practice, a lot of emphasis is put on reusing allocated memory and avoiding allocations. In particular for the column-wise algorithm, even allocating and zeroing an array of size m+n for an m x n matrix can significantly slow down the code!
  3. The graphs of the S, P and Q members do not need to be stored explicitly, as they always have the same structure. This also makes it easier to permute edges of S nodes on the fly.

Definition in file network.c.

#include <assert.h>
#include "scip/misc.h"
#include "scip/pub_misc.h"
#include "scip/pub_network.h"
#include "scip/scip.h"
#include "blockmemshell/memory.h"

Go to the source code of this file.

Data Structures

struct  SPQRNetworkDecompositionArcListNode
 
struct  SPQRNetworkDecompositionNode
 
struct  SPQRNetworkDecompositionArc
 
struct  SPQRNetworkDecompositionMember
 
struct  SCIP_NETMATDECDATA
 
struct  ArcSign
 
struct  FindCycleCall
 
struct  PathArcListNode
 
struct  SPQRColReducedMember
 
struct  SPQRColReducedComponent
 
struct  MemberInfo
 
struct  CreateReducedMembersCallstack
 
struct  SCIP_NETCOLADD
 
struct  NewColInformation
 
struct  CutArcListNode
 
struct  ArticulationNodeInformation
 
struct  DFSCallData
 
struct  MergeTreeCallData
 
struct  ColorDFSCallData
 
struct  ArticulationPointCallStack
 
struct  SPQRRowReducedMember
 
struct  SPQRRowReducedComponent
 
struct  SCIP_NETROWADD
 
struct  NewRowInformation
 
struct  Nodes
 
struct  SplitOrientation
 
struct  SCIP_Netmatdec
 

Macros

#define SPQR_INVALID   INT_MAX
 
#define SPQR_INVALID_ROW   SPQR_INVALID
 
#define SPQR_INVALID_COL   SPQR_INVALID
 
#define MARKER_ROW_ELEMENT   (INT_MIN)
 
#define MARKER_COLUMN_ELEMENT   (INT_MAX)
 
#define SPQR_INVALID_MEMBER   (-1)
 
#define SPQR_INVALID_NODE   (-1)
 
#define SPQR_INVALID_ARC   (-1)
 
#define INVALID_PATH_ARC   (-1)
 
#define INVALID_REDUCED_MEMBER   (-1)
 
#define NEWCOLINFORMATION_EMPTY   { SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, SPQR_INVALID_NODE, SPQR_INVALID_ARC, FALSE }
 
#define INVALID_CUT_ARC   (-1)
 
#define NEWROWINFORMATION_EMPTY   { SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, SPQR_INVALID_NODE, SPQR_INVALID_ARC, FALSE }
 

Typedefs

typedef int spqr_matrix_size
 
typedef spqr_matrix_size spqr_row
 
typedef spqr_matrix_size spqr_col
 
typedef int spqr_element
 
typedef int spqr_member
 
typedef int spqr_node
 
typedef int spqr_arc
 
typedef int path_arc_id
 
typedef int reduced_member_id
 
typedef int children_idx
 
typedef int cut_arc_id
 

Enumerations

enum  SPQRMemberType {
  SPQR_MEMBERTYPE_RIGID = 0 ,
  SPQR_MEMBERTYPE_PARALLEL = 1 ,
  SPQR_MEMBERTYPE_SERIES = 2 ,
  SPQR_MEMBERTYPE_LOOP = 3 ,
  SPQR_MEMBERTYPE_UNASSIGNED = 4
}
 
enum  ReducedMemberType {
  REDUCEDMEMBER_TYPE_UNASSIGNED = 0 ,
  REDUCEDMEMBER_TYPE_CYCLE = 1 ,
  REDUCEDMEMBER_TYPE_MERGED = 2 ,
  REDUCEDMEMBER_TYPE_NOT_NETWORK = 3
}
 
enum  MemberPathType {
  INTO_HEAD = 0 ,
  INTO_TAIL = 1 ,
  OUT_HEAD = 2 ,
  OUT_TAIL = 3
}
 
enum  RowReducedMemberType {
  TYPE_UNDETERMINED = 0 ,
  TYPE_PROPAGATED = 1 ,
  TYPE_MERGED = 2 ,
  TYPE_NOT_NETWORK = 3
}
 
enum  COLOR_STATUS {
  UNCOLORED = 0 ,
  COLOR_SOURCE = 1 ,
  COLOR_SINK = 2
}
 

Functions

static SCIP_Bool SPQRrowIsInvalid (spqr_row row)
 
static SCIP_Bool SPQRcolIsInvalid (spqr_col col)
 
static SCIP_Bool SPQRrowIsValid (spqr_row row)
 
static SCIP_Bool SPQRcolIsValid (spqr_col col)
 
static SCIP_Bool SPQRelementIsRow (spqr_element element)
 
static SCIP_Bool SPQRelementIsColumn (spqr_element element)
 
static spqr_row SPQRelementToRow (spqr_element element)
 
static spqr_element SPQRrowToElement (spqr_row row)
 
static spqr_col SPQRelementToColumn (spqr_element element)
 
static spqr_element SPQRcolumnToElement (spqr_col column)
 
static SCIP_Bool SPQRmemberIsInvalid (spqr_member member)
 
static SCIP_Bool SPQRmemberIsValid (spqr_member member)
 
static SCIP_Bool SPQRnodeIsInvalid (spqr_node node)
 
static SCIP_Bool SPQRnodeIsValid (spqr_node node)
 
static SCIP_Bool SPQRarcIsInvalid (spqr_arc arc)
 
static SCIP_Bool SPQRarcIsValid (spqr_arc arc)
 
static SCIP_Bool nodeIsRepresentative (const SCIP_NETMATDECDATA *dec, spqr_node node)
 
static spqr_node findNode (SCIP_NETMATDECDATA *dec, spqr_node node)
 
static spqr_node findNodeNoCompression (const SCIP_NETMATDECDATA *dec, spqr_node node)
 
static spqr_node findArcTail (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_node findArcHead (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_node findArcHeadNoCompression (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_node findArcTailNoCompression (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_arc getFirstNodeArc (const SCIP_NETMATDECDATA *dec, spqr_node node)
 
static spqr_arc getNextNodeArcNoCompression (const SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_node node)
 
static spqr_arc getNextNodeArc (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_node node)
 
static spqr_arc getPreviousNodeArc (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_node node)
 
static void mergeNodeArcList (SCIP_NETMATDECDATA *dec, spqr_node toMergeInto, spqr_node toRemove)
 
static void arcFlipReversed (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static void arcSetReversed (SCIP_NETMATDECDATA *dec, spqr_arc arc, SCIP_Bool reversed)
 
static void arcSetRepresentative (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_arc representative)
 
static spqr_node mergeNodes (SCIP_NETMATDECDATA *dec, spqr_node first, spqr_node second)
 
static SCIP_Bool memberIsRepresentative (const SCIP_NETMATDECDATA *dec, spqr_member member)
 
static spqr_member findMember (SCIP_NETMATDECDATA *dec, spqr_member member)
 
static spqr_member findMemberNoCompression (const SCIP_NETMATDECDATA *dec, spqr_member member)
 
static spqr_member mergeMembers (SCIP_NETMATDECDATA *dec, spqr_member first, spqr_member second)
 
static spqr_member findArcMember (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_member findArcMemberNoCompression (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_member findMemberParent (SCIP_NETMATDECDATA *dec, spqr_member member)
 
static spqr_member findMemberParentNoCompression (const SCIP_NETMATDECDATA *dec, spqr_member member)
 
static spqr_member findArcChildMember (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_member findArcChildMemberNoCompression (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static SCIP_Bool arcIsChildMarker (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static SCIP_Bool arcIsTree (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static SCIP_Bool arcIsRepresentative (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static ArcSign findArcSign (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static ArcSign findArcSignNoCompression (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_node findEffectiveArcHead (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_node findEffectiveArcTail (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_node findEffectiveArcHeadNoCompression (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_node findEffectiveArcTailNoCompression (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_arc mergeArcSigns (SCIP_NETMATDECDATA *dec, spqr_arc first, spqr_arc second, SCIP_Bool reflectRelative)
 
static SCIP_Bool arcIsReversedNonRigid (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_element arcGetElement (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static SCIP_Bool netMatDecDataContainsRow (SCIP_NETMATDECDATA *dec, int row)
 
static SCIP_Bool netMatDecDataContainsColumn (SCIP_NETMATDECDATA *dec, int column)
 
static void setDecompositionColumnArc (SCIP_NETMATDECDATA *dec, spqr_col col, spqr_arc arc)
 
static void setDecompositionRowArc (SCIP_NETMATDECDATA *dec, spqr_row row, spqr_arc arc)
 
static spqr_arc getDecompositionColumnArc (const SCIP_NETMATDECDATA *dec, spqr_col col)
 
static spqr_arc getDecompositionRowArc (const SCIP_NETMATDECDATA *dec, spqr_row row)
 
static SCIP_RETCODE netMatDecDataCreate (BMS_BLKMEM *blkmem, SCIP_NETMATDECDATA **pdec, int nrows, int ncols)
 
static void netMatDecDataFree (SCIP_NETMATDECDATA **pdec)
 
static spqr_arc getFirstMemberArc (const SCIP_NETMATDECDATA *dec, spqr_member member)
 
static spqr_arc getNextMemberArc (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static spqr_arc getPreviousMemberArc (const SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static void addArcToMemberArcList (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_member member)
 
static SCIP_RETCODE createArc (SCIP_NETMATDECDATA *dec, spqr_member member, SCIP_Bool reversed, spqr_arc *pArc)
 
static SCIP_RETCODE createRowArc (SCIP_NETMATDECDATA *dec, spqr_member member, spqr_arc *pArc, spqr_row row, SCIP_Bool reversed)
 
static SCIP_RETCODE createColumnArc (SCIP_NETMATDECDATA *dec, spqr_member member, spqr_arc *pArc, spqr_col column, SCIP_Bool reversed)
 
static SCIP_RETCODE createMember (SCIP_NETMATDECDATA *dec, SPQRMemberType type, spqr_member *pMember)
 
static SCIP_RETCODE createNode (SCIP_NETMATDECDATA *dec, spqr_node *pNode)
 
static void removeArcFromNodeArcList (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_node node, SCIP_Bool nodeIsHead)
 
static void addArcToNodeArcList (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_node node, SCIP_Bool nodeIsHead)
 
static void setArcHeadAndTail (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_node head, spqr_node tail)
 
static void clearArcHeadAndTail (SCIP_NETMATDECDATA *dec, spqr_arc arc)
 
static void changeArcHead (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_node oldHead, spqr_node newHead)
 
static void changeArcTail (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_node oldTail, spqr_node newTail)
 
static int nodeDegree (SCIP_NETMATDECDATA *dec, spqr_node node)
 
static SPQRMemberType getMemberType (const SCIP_NETMATDECDATA *dec, spqr_member member)
 
static void updateMemberType (const SCIP_NETMATDECDATA *dec, spqr_member member, SPQRMemberType type)
 
static spqr_arc markerToParent (const SCIP_NETMATDECDATA *dec, spqr_member member)
 
static void updateMemberParentInformation (SCIP_NETMATDECDATA *dec, const spqr_member newMember, const spqr_member toRemove)
 
static spqr_arc markerOfParent (const SCIP_NETMATDECDATA *dec, spqr_member member)
 
static int getNumMemberArcs (const SCIP_NETMATDECDATA *dec, spqr_member member)
 
static int getNumNodes (const SCIP_NETMATDECDATA *dec)
 
static int getNumMembers (const SCIP_NETMATDECDATA *dec)
 
static SCIP_RETCODE createStandaloneParallel (SCIP_NETMATDECDATA *dec, spqr_col *columns, SCIP_Bool *reversed, int num_columns, spqr_row row, spqr_member *pMember)
 
static SCIP_RETCODE createConnectedParallel (SCIP_NETMATDECDATA *dec, spqr_col *columns, SCIP_Bool *reversed, int num_columns, spqr_row row, spqr_member *pMember)
 
static SCIP_RETCODE createStandaloneSeries (SCIP_NETMATDECDATA *dec, spqr_row *rows, SCIP_Bool *reversed, int numRows, spqr_col col, spqr_member *pMember)
 
static SCIP_RETCODE createConnectedSeries (SCIP_NETMATDECDATA *dec, spqr_row *rows, SCIP_Bool *reversed, int numRows, spqr_col col, spqr_member *pMember)
 
static void removeArcFromMemberArcList (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_member member)
 
static void process_arc (spqr_row *cyclearcs, int *num_cycle_arcs, FindCycleCall *callStack, int *callStackSize, spqr_arc arc, const SCIP_NETMATDECDATA *dec, SCIP_Bool *cycledir, SCIP_Bool arcIsReversed)
 
static int decompositionGetFundamentalCycleRows (const SCIP_NETMATDECDATA *dec, spqr_col column, spqr_row *output, SCIP_Bool *computedSignStorage)
 
static SCIP_Bool netMatDecDataVerifyCycle (BMS_BUFMEM *bufmem, const SCIP_NETMATDECDATA *dec, int column, const int *nonzrowidx, const double *nonzvals, int num_rows, int *pathrowstorage, SCIP_Bool *pathsignstorage)
 
static spqr_member largestMemberID (const SCIP_NETMATDECDATA *dec)
 
static spqr_arc largestArcID (const SCIP_NETMATDECDATA *dec)
 
static spqr_node largestNodeID (const SCIP_NETMATDECDATA *dec)
 
static int numConnectedComponents (const SCIP_NETMATDECDATA *dec)
 
static SCIP_RETCODE createChildMarker (SCIP_NETMATDECDATA *dec, spqr_member member, spqr_member child, SCIP_Bool isTree, spqr_arc *pArc, SCIP_Bool reversed)
 
static SCIP_RETCODE createParentMarker (SCIP_NETMATDECDATA *dec, spqr_member member, SCIP_Bool isTree, spqr_member parent, spqr_arc parentMarker, spqr_arc *arc, SCIP_Bool reversed)
 
static SCIP_RETCODE createMarkerPair (SCIP_NETMATDECDATA *dec, spqr_member parentMember, spqr_member childMember, SCIP_Bool parentIsTree, SCIP_Bool childMarkerReversed, SCIP_Bool parentMarkerReversed)
 
static SCIP_RETCODE createMarkerPairWithReferences (SCIP_NETMATDECDATA *dec, spqr_member parentMember, spqr_member childMember, SCIP_Bool parentIsTree, SCIP_Bool childMarkerReversed, SCIP_Bool parentMarkerReversed, spqr_arc *parentToChild, spqr_arc *childToParent)
 
static void moveArcToNewMember (SCIP_NETMATDECDATA *dec, spqr_arc arc, spqr_member oldMember, spqr_member newMember)
 
static void mergeMemberArcList (SCIP_NETMATDECDATA *dec, spqr_member toMergeInto, spqr_member toRemove)
 
static void changeLoopToSeries (SCIP_NETMATDECDATA *dec, spqr_member member)
 
static void changeLoopToParallel (SCIP_NETMATDECDATA *dec, spqr_member member)
 
static SCIP_Bool netMatDecDataIsMinimal (const SCIP_NETMATDECDATA *dec)
 
static void decreaseNumConnectedComponents (SCIP_NETMATDECDATA *dec, int by)
 
static void reorderComponent (SCIP_NETMATDECDATA *dec, spqr_member newRoot)
 
static void netMatDecDataRemoveComponent (SCIP_NETMATDECDATA *dec, const int *componentRows, int numRows, const int *componentCols, int numCols)
 
static SCIP_RETCODE mergeGivenMemberIntoParent (SCIP_NETMATDECDATA *dec, spqr_member member, spqr_member parent, spqr_arc parentToChild, spqr_arc childToParent, SCIP_Bool headToHead, spqr_member *mergedMember)
 
static SCIP_RETCODE netMatDecDataCreateDiGraph (SCIP_NETMATDECDATA *dec, BMS_BLKMEM *blkmem, SCIP_DIGRAPH **pdigraph, SCIP_Bool createrowarcs)
 
static SCIP_Bool pathArcIsInvalid (const path_arc_id arc)
 
static SCIP_Bool pathArcIsValid (const path_arc_id arc)
 
static SCIP_Bool reducedMemberIsInvalid (const reduced_member_id id)
 
static SCIP_Bool reducedMemberIsValid (const reduced_member_id id)
 
static SCIP_Bool isInto (MemberPathType type)
 
static SCIP_Bool isHead (MemberPathType type)
 
static void cleanupPreviousIteration (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol)
 
static SCIP_RETCODE netcoladdCreate (BMS_BLKMEM *blkmem, SCIP_NETCOLADD **pcoladd)
 
static void netcoladdFree (BMS_BLKMEM *blkmem, SCIP_NETCOLADD **pcoladd)
 
static reduced_member_id createReducedMembersToRoot (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, const spqr_member firstMember)
 
static SCIP_RETCODE constructReducedDecomposition (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol)
 
static void cleanUpMemberInformation (SCIP_NETCOLADD *newCol)
 
static void createPathArc (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, const spqr_arc arc, const reduced_member_id reducedMember, SCIP_Bool reversed)
 
static SCIP_RETCODE createPathArcs (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol)
 
static SCIP_RETCODE newColUpdateColInformation (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, spqr_col column, const spqr_row *nonzeroRows, const double *nonzeroValues, int numNonzeros)
 
static SCIP_RETCODE computeLeafMembers (const SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol)
 
static void determineRigidPath (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, SPQRColReducedMember *redMem)
 
static void determineSingleRigidType (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMember)
 
static void determineSingleComponentType (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMember)
 
static void determinePathSeriesType (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMember, spqr_member member, MemberPathType previousType, spqr_arc source, spqr_arc target)
 
static void determinePathParallelType (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMember, spqr_member member, MemberPathType previousType, spqr_arc source, spqr_arc target)
 
static void determinePathRigidType (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMember, MemberPathType previousType, spqr_arc source, spqr_arc target)
 
static void determinePathMemberType (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMember, spqr_member member, MemberPathType previousType, spqr_arc source, spqr_arc target)
 
static void determinePathTypes (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, SPQRColReducedComponent *component)
 
static void checkRigidLeaf (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id leaf, spqr_arc toParent, reduced_member_id parent, spqr_arc toChild)
 
static ReducedMemberType checkLeaf (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id leaf, spqr_arc toParent, reduced_member_id parent, spqr_arc toChild)
 
static void propagateCycles (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol)
 
static void determineComponentTypes (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, SPQRColReducedComponent *component)
 
static SCIP_RETCODE netcoladdCheck (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *coladd, int column, const int *nonzrows, const double *nonzvals, int nnonzs)
 
static void setTerminalHead (NewColInformation *info, spqr_node node)
 
static void setTerminalTail (NewColInformation *info, spqr_node node)
 
static void setTerminalReversed (NewColInformation *info, SCIP_Bool reversed)
 
static void setTerminalMember (NewColInformation *info, spqr_member member)
 
static void setTerminalRepresentative (NewColInformation *info, spqr_arc representative)
 
static SCIP_RETCODE splitParallel (SCIP_NETMATDECDATA *dec, spqr_member parallel, spqr_arc arc1, spqr_arc arc2, spqr_member *childParallel)
 
static SCIP_RETCODE splitSeries (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, SPQRColReducedMember *reducedMember, spqr_member member, spqr_member *loopMember, NewColInformation *newColInfo)
 
static SCIP_RETCODE splitSeriesMerging (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, SPQRColReducedMember *reducedMember, spqr_member member, spqr_arc *pathRepresentative, spqr_arc *nonPathRepresentative, spqr_arc exceptionArc1, spqr_arc exceptionArc2)
 
static SCIP_RETCODE transformFirstPathMember (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMember, NewColInformation *newColInfo, spqr_arc *representativeArc, spqr_member *mergedMember)
 
static SCIP_RETCODE transformAndMergeParallel (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id current, reduced_member_id next, spqr_member nextMember, SCIP_Bool nextIsParent, spqr_arc *representativeArc, spqr_member *mergedMember)
 
static SCIP_RETCODE transformAndMergeSeries (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id current, reduced_member_id next, spqr_member nextMember, SCIP_Bool nextIsParent, spqr_arc *representativeArc, spqr_member *mergedMember, NewColInformation *info)
 
static SCIP_RETCODE transformAndMergeRigid (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id current, reduced_member_id next, spqr_member nextMember, SCIP_Bool nextIsParent, spqr_arc *representativeArc, spqr_member *mergedMember, NewColInformation *info)
 
static SCIP_RETCODE transformAndMerge (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id current, reduced_member_id next, spqr_arc *representativeArc, spqr_member *mergedMember, SCIP_Bool nextIsParent, NewColInformation *info)
 
static SCIP_RETCODE transformPath (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, SPQRColReducedComponent *component, NewColInformation *newColInfo)
 
static SCIP_RETCODE columnTransformSingleParallel (SCIP_NETCOLADD *newCol, reduced_member_id reducedMemberId, spqr_member member, NewColInformation *newColInfo)
 
static SCIP_RETCODE columnTransformSingleSeries (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMemberId, spqr_member member, NewColInformation *newColInfo)
 
static SCIP_RETCODE columnTransformSingleRigid (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, reduced_member_id reducedMemberId, spqr_member member, NewColInformation *newColInfo)
 
static SCIP_RETCODE transformComponent (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol, SPQRColReducedComponent *component, NewColInformation *newColInfo)
 
static SCIP_Bool netcoladdRemainsNetwork (const SCIP_NETCOLADD *newCol)
 
static SCIP_RETCODE netcoladdAdd (SCIP_NETMATDECDATA *dec, SCIP_NETCOLADD *newCol)
 
static SCIP_Bool cutArcIsInvalid (const cut_arc_id arc)
 
static SCIP_Bool cutArcIsValid (const cut_arc_id arc)
 
static SCIP_RETCODE newRowUpdateRowInformation (const SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const spqr_row row, const spqr_col *columns, const double *columnValues, const int numColumns)
 
static reduced_member_id createRowReducedMembersToRoot (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const spqr_member firstMember)
 
static SCIP_RETCODE constructRowReducedDecomposition (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow)
 
static void createCutArc (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const spqr_arc arc, const reduced_member_id reducedMember, SCIP_Bool reversed)
 
static SCIP_RETCODE createReducedDecompositionCutArcs (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow)
 
static SCIP_RETCODE determineLeafReducedMembers (const SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow)
 
static SCIP_RETCODE allocateRigidSearchMemory (const SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow)
 
static void zeroOutColors (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const spqr_node firstRemoveNode)
 
static void cleanUpPreviousIteration (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow)
 
static void rigidFindStarNodes (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id toCheck)
 
static void zeroOutColorsExceptNeighbourhood (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const spqr_node articulationNode, const spqr_node startRemoveNode)
 
static void intersectionOfAllPaths (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id toCheck, int *const nodeNumPaths)
 
static void addArticulationNode (SCIP_NETROWADD *newRow, spqr_node articulationNode)
 
static void articulationPoints (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, ArticulationNodeInformation *nodeInfo, reduced_member_id reducedMember)
 
static void rigidConnectedColoringRecursive (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, spqr_node articulationNode, spqr_node firstProcessNode, COLOR_STATUS firstColor, SCIP_Bool *isGood)
 
static void rigidConnectedColoring (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id reducedMember, const spqr_node node, SCIP_Bool *const isGood)
 
static spqr_node checkNeighbourColoringArticulationNode (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const spqr_node articulationNode, spqr_arc *const adjacentSplittingArc)
 
static void rigidGetSplittableArticulationPointsOnPath (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id toCheck, spqr_node firstNode, spqr_node secondNode)
 
static void determineParallelType (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id toCheckMember, const spqr_arc markerToOther, const reduced_member_id otherMember, const spqr_arc markerToCheck)
 
static void determineSeriesType (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id toCheckMember, const spqr_arc markerToOther, const reduced_member_id otherMember, const spqr_arc markerToCheck)
 
static void determineRigidType (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id toCheckMember, const spqr_arc markerToOther, const reduced_member_id otherMember, const spqr_arc markerToCheck)
 
static RowReducedMemberType determineType (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id toCheckMember, const spqr_arc markerToOther, const reduced_member_id otherMember, const spqr_arc markerToCheck)
 
static void propagateComponents (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow)
 
static Nodes rigidDetermineCandidateNodesFromAdjacentComponents (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id toCheck)
 
static SCIP_RETCODE allocateTreeSearchMemory (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow)
 
static void determineSingleRowRigidType (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedMember)
 
static void determineSingleParallelType (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedMember)
 
static void determineSingleSeriesType (SCIP_NETROWADD *newRow, reduced_member_id reducedMember)
 
static spqr_node determineAndColorSplitNode (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id id, spqr_node candidateOne, spqr_node candidateTwo)
 
static void determineSplitTypeFirstLeaf (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedId)
 
static SplitOrientation getRelativeOrientationRigid (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedId, spqr_arc arcToNext)
 
static SplitOrientation getRelativeOrientationParallel (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedId, spqr_arc arcToNext)
 
static SplitOrientation getRelativeOrientationSeries (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedId, spqr_arc arcToNext)
 
static SplitOrientation getRelativeOrientation (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedId, spqr_arc arcToNext)
 
static void determineSplitTypeSeries (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedId, spqr_arc marker, SplitOrientation previousOrientation)
 
static void determineSplitTypeParallel (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedId, spqr_arc marker, SplitOrientation previousOrientation)
 
static void determineSplitTypeRigid (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedId, spqr_member member, spqr_arc marker, SplitOrientation previousOrientation)
 
static void determineSplitTypeNext (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id current, reduced_member_id next, SCIP_Bool currentIsParent)
 
static void determineMergeableTypes (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id root)
 
static void cleanUpRowMemberInformation (SCIP_NETROWADD *newRow)
 
static SCIP_RETCODE rigidTransformArcIntoCycle (SCIP_NETMATDECDATA *dec, const spqr_member member, const spqr_arc arc, const SCIP_Bool reverseArcDirection, NewRowInformation *const newRowInfo)
 
static SCIP_RETCODE transformSingleRigid (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id reducedMember, const spqr_member member, NewRowInformation *const newRowInfo)
 
static SCIP_RETCODE splitParallelRowAddition (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id reducedMember, const spqr_member member, NewRowInformation *const newRowInfo)
 
static SCIP_RETCODE transformSingleParallel (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id reducedMember, const spqr_member member, NewRowInformation *info)
 
static SCIP_RETCODE splitSeriesMergingRowAddition (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, const reduced_member_id reducedMember, const spqr_member member, spqr_member *const mergingMember, SCIP_Bool *const isCut, spqr_arc *representativeEdge)
 
static SCIP_RETCODE splitParallelMerging (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id reducedMember, spqr_member member, spqr_member *const pMergeMember, spqr_arc *const cutRepresentative)
 
static SCIP_RETCODE splitFirstLeaf (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id leaf, NewRowInformation *const newRowInfo)
 
static SCIP_RETCODE mergeSplitMemberIntoParent (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, spqr_member member, spqr_member parent, spqr_arc parentToChild, spqr_arc childToParent, SCIP_Bool headToHead, spqr_node parentNode, spqr_node childNode, spqr_member *mergedMember, spqr_node *arcNodeOne, spqr_node *arcNodeTwo, spqr_node *thirdNode)
 
static SCIP_RETCODE splitAndMergeSeries (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id smallMember, SCIP_Bool largeIsParent, NewRowInformation *const newRowInfo, spqr_member member)
 
static SCIP_RETCODE splitAndMergeParallel (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id smallMember, SCIP_Bool largeIsParent, NewRowInformation *const newRowInfo, spqr_member member)
 
static SCIP_RETCODE splitAndMergeRigid (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id smallMember, SCIP_Bool largeIsParent, NewRowInformation *const newRowInfo, spqr_member member)
 
static SCIP_RETCODE splitAndMerge (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id smallMember, SCIP_Bool largeIsParent, NewRowInformation *const newRowInfo)
 
static SCIP_RETCODE mergeTree (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, reduced_member_id root, NewRowInformation *const newRowInfo)
 
static SCIP_RETCODE transformComponentRowAddition (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *newRow, SPQRRowReducedComponent *component, NewRowInformation *const newRowInfo)
 
static SCIP_RETCODE netrowaddCreate (BMS_BLKMEM *blkmem, SCIP_NETROWADD **prowadd)
 
static void netrowaddFree (BMS_BLKMEM *blkmem, SCIP_NETROWADD **prowadd)
 
static SCIP_RETCODE netrowaddCheck (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *rowadd, int row, const int *nonzcols, const double *nonzvals, int nnonzs)
 
static SCIP_RETCODE netrowaddAdd (SCIP_NETMATDECDATA *dec, SCIP_NETROWADD *rowadd)
 
static SCIP_Bool netrowaddRemainsNetwork (const SCIP_NETROWADD *rowadd)
 
SCIP_RETCODE SCIPnetmatdecCreate (BMS_BLKMEM *blkmem, SCIP_NETMATDEC **pdec, int nrows, int ncols)
 
void SCIPnetmatdecFree (SCIP_NETMATDEC **pdec)
 
SCIP_RETCODE SCIPnetmatdecTryAddCol (SCIP_NETMATDEC *dec, int column, int *nonzrows, double *nonzvals, int nnonzs, SCIP_Bool *success)
 
SCIP_RETCODE SCIPnetmatdecTryAddRow (SCIP_NETMATDEC *dec, int row, int *nonzcols, double *nonzvals, int nnonzs, SCIP_Bool *success)
 
SCIP_Bool SCIPnetmatdecContainsRow (SCIP_NETMATDEC *dec, int row)
 
SCIP_Bool SCIPnetmatdecContainsColumn (SCIP_NETMATDEC *dec, int column)
 
void SCIPnetmatdecRemoveComponent (SCIP_NETMATDEC *dec, int *componentrows, int nrows, int *componentcols, int ncols)
 
SCIP_Bool SCIPnetmatdecIsMinimal (SCIP_NETMATDEC *dec)
 
SCIP_Bool SCIPnetmatdecVerifyCycle (BMS_BUFMEM *bufmem, SCIP_NETMATDEC *dec, int column, int *nonzrowidx, double *nonzvals, int nnonzs, int *pathrowstorage, SCIP_Bool *pathsignstorage)
 
SCIP_RETCODE SCIPnetmatdecCreateDiGraph (SCIP_NETMATDEC *dec, BMS_BLKMEM *blkmem, SCIP_DIGRAPH **pdigraph, SCIP_Bool createrowarcs)
 

Macro Definition Documentation

◆ SPQR_INVALID

#define SPQR_INVALID   INT_MAX

Definition at line 141 of file network.c.

◆ SPQR_INVALID_ROW

#define SPQR_INVALID_ROW   SPQR_INVALID

Definition at line 142 of file network.c.

◆ SPQR_INVALID_COL

#define SPQR_INVALID_COL   SPQR_INVALID

Definition at line 143 of file network.c.

◆ MARKER_ROW_ELEMENT

#define MARKER_ROW_ELEMENT   (INT_MIN)

Columns 0..x correspond to elements 0..x and rows 0..y correspond to elements -1.. -y-1

Definition at line 188 of file network.c.

◆ MARKER_COLUMN_ELEMENT

#define MARKER_COLUMN_ELEMENT   (INT_MAX)

Definition at line 189 of file network.c.

◆ SPQR_INVALID_MEMBER

#define SPQR_INVALID_MEMBER   (-1)

Definition at line 260 of file network.c.

◆ SPQR_INVALID_NODE

#define SPQR_INVALID_NODE   (-1)

Definition at line 285 of file network.c.

◆ SPQR_INVALID_ARC

#define SPQR_INVALID_ARC   (-1)

Definition at line 313 of file network.c.

◆ INVALID_PATH_ARC

#define INVALID_PATH_ARC   (-1)

Definition at line 3439 of file network.c.

◆ INVALID_REDUCED_MEMBER

#define INVALID_REDUCED_MEMBER   (-1)

Definition at line 3480 of file network.c.

◆ NEWCOLINFORMATION_EMPTY

#define NEWCOLINFORMATION_EMPTY   { SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, SPQR_INVALID_NODE, SPQR_INVALID_ARC, FALSE }

Definition at line 5498 of file network.c.

◆ INVALID_CUT_ARC

#define INVALID_CUT_ARC   (-1)

Definition at line 6772 of file network.c.

◆ NEWROWINFORMATION_EMPTY

#define NEWROWINFORMATION_EMPTY   { SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, SPQR_INVALID_NODE, SPQR_INVALID_ARC, FALSE }

Definition at line 7016 of file network.c.

Typedef Documentation

◆ spqr_matrix_size

typedef int spqr_matrix_size

Definition at line 137 of file network.c.

◆ spqr_row

Definition at line 138 of file network.c.

◆ spqr_col

Definition at line 139 of file network.c.

◆ spqr_element

typedef int spqr_element

Definition at line 190 of file network.c.

◆ spqr_member

typedef int spqr_member

spqr_member is an index for the members of the SPQR decomposition

The members are the nodes of the SPQR tree. Each member has an associated subgraph, sometimes called a skeleton. If two members are adjacent in the SPQR tree, the two corresponding subgraphs are connected by a 2-separation in any graph represented by the matrix. For members, we reserve all negative values as invalid. We use these negative values in union-find datastructure, where we store the rank of the representative as a negative number.

Definition at line 259 of file network.c.

◆ spqr_node

typedef int spqr_node

spqr_node is an index for the nodes stored in the decomposition.

The nodes are part of each member's skeleton. Similar to spqr_member, we reserve all negative values as invalid and use these in union-find.

Definition at line 284 of file network.c.

◆ spqr_arc

typedef int spqr_arc

spqr_arc is an index for the arcs stored in the decomposition.

The arcs are part of each member's skeleton. Similar to spqr_node and spqr_member, we reserve all negative values as invalid and use these in some union-find. However, in contrast to spqr_node and spqr_member, the union-find data structure does not represent the arcs, but rather if all arcs that have the same representative we know they are in the same member.

Definition at line 312 of file network.c.

◆ path_arc_id

typedef int path_arc_id

Path arcs are all those arcs that correspond to nonzeros of the column to be added.

Definition at line 3438 of file network.c.

◆ reduced_member_id

typedef int reduced_member_id

Index for the reduced members, which are the members of the sub-SPQR tree containing all path arcs.

Note that these are indexed separately from the members of the SPQR tree!

Definition at line 3479 of file network.c.

◆ children_idx

typedef int children_idx

Array index for the children of a reduced member

Definition at line 3501 of file network.c.

◆ cut_arc_id

typedef int cut_arc_id

Index type for the nonzeros of the new row, e.g. the columns whose tree path must be elongated with the new row

Definition at line 6771 of file network.c.

Enumeration Type Documentation

◆ SPQRMemberType

The type of the member

Enumerator
SPQR_MEMBERTYPE_RIGID 

The member's skeleton is 3-connected and has at least 4 edges

SPQR_MEMBERTYPE_PARALLEL 

The member's skeleton consists of 2 nodes with at least 3 edges

SPQR_MEMBERTYPE_SERIES 

The member's skeleton is a cycle with at least 3 edges

SPQR_MEMBERTYPE_LOOP 

The member's skeleton consists of 2 nodes connected by 1 or 2 edges

SPQR_MEMBERTYPE_UNASSIGNED 

To indicate that the member is not a representative member anymore

Definition at line 334 of file network.c.

◆ ReducedMemberType

Type of the member, signifies to what degree we processed the member and how to treat with it when updating the graph.

Enumerator
REDUCEDMEMBER_TYPE_UNASSIGNED 

We have not yet decided if the reduced member contains a valid path

REDUCEDMEMBER_TYPE_CYCLE 

The reduced member is a leaf node of the SPQR tree and contains a path that forms a cycle with the corresponding virtual edge, i.e. it is propagated

REDUCEDMEMBER_TYPE_MERGED 

The reduced member contains a path and is not propagated

REDUCEDMEMBER_TYPE_NOT_NETWORK 

The reduced member does not have a valid path or can not be oriented to form a valid path with the other members.

Definition at line 3506 of file network.c.

◆ MemberPathType

Defines the structure of the path in the reduced member

Enumerator
INTO_HEAD 

The directed path goes into the head of the virtual arc

INTO_TAIL 

The directed path goes into the tail of the virtual arc

OUT_HEAD 

The directed path goes out of the head of the virtual arc

OUT_TAIL 

The directed path goes out of the tail of the virtual arc

Definition at line 3518 of file network.c.

◆ RowReducedMemberType

Type of the reduced member

Indicates whether the member is processed, and whether it should be merged or left the same.

Enumerator
TYPE_UNDETERMINED 

The type of this member has not yet been determined

TYPE_PROPAGATED 

The member contains cut arcs, but should not be merged

TYPE_MERGED 

This member should be merged into a rigid member

TYPE_NOT_NETWORK 

This member implies that the addition of the new row does not create a network matrix

Definition at line 6811 of file network.c.

◆ COLOR_STATUS

Colors assigned to the node in the partitioning algorithm.

It must either be in the source or the sink partition.

Enumerator
UNCOLORED 

The current node has not yet been processed

COLOR_SOURCE 

The current node belongs to the source partition

COLOR_SINK 

The current node belongs to the sink partition

Definition at line 6862 of file network.c.

Function Documentation

◆ SPQRrowIsInvalid()

static SCIP_Bool SPQRrowIsInvalid ( spqr_row  row)
static

Determine if the row index is invalid

Parameters
rowThe row to check

Definition at line 151 of file network.c.

References SPQR_INVALID_ROW.

Referenced by SPQRrowIsValid().

◆ SPQRcolIsInvalid()

static SCIP_Bool SPQRcolIsInvalid ( spqr_col  col)
static

Determine if the column index is invalid

Parameters
colThe column to check

Definition at line 160 of file network.c.

References SPQR_INVALID_COL.

Referenced by SPQRcolIsValid().

◆ SPQRrowIsValid()

static SCIP_Bool SPQRrowIsValid ( spqr_row  row)
static

Determine if the row index is valid

Parameters
rowThe row to check

Definition at line 169 of file network.c.

References SPQRrowIsInvalid().

Referenced by getDecompositionRowArc(), netMatDecDataContainsRow(), setDecompositionRowArc(), and SPQRrowToElement().

◆ SPQRcolIsValid()

static SCIP_Bool SPQRcolIsValid ( spqr_col  col)
static

Determine if the column index is valid

Parameters
colThe column to check

Definition at line 178 of file network.c.

References SPQRcolIsInvalid().

Referenced by getDecompositionColumnArc(), netMatDecDataContainsColumn(), setDecompositionColumnArc(), and SPQRcolumnToElement().

◆ SPQRelementIsRow()

static SCIP_Bool SPQRelementIsRow ( spqr_element  element)
static

Checks if an element is a row

Parameters
elementThe element to check

Definition at line 194 of file network.c.

Referenced by arcIsTree(), netMatDecDataCreateDiGraph(), process_arc(), SPQRelementIsColumn(), and SPQRelementToRow().

◆ SPQRelementIsColumn()

static SCIP_Bool SPQRelementIsColumn ( spqr_element  element)
static

Checks if an element is a column

Parameters
elementThe element to check

Definition at line 203 of file network.c.

References SPQRelementIsRow().

Referenced by columnTransformSingleRigid(), rigidTransformArcIntoCycle(), and SPQRelementToColumn().

◆ SPQRelementToRow()

static spqr_row SPQRelementToRow ( spqr_element  element)
static

Convert an element to the corresponding row index

Parameters
elementThe element to convert

Definition at line 212 of file network.c.

References SPQRelementIsRow().

Referenced by columnTransformSingleRigid(), netMatDecDataCreateDiGraph(), process_arc(), and rigidTransformArcIntoCycle().

◆ SPQRrowToElement()

static spqr_element SPQRrowToElement ( spqr_row  row)
static

Convert a row to the corresponding element

Parameters
rowThe row to convert

Definition at line 222 of file network.c.

References SPQRrowIsValid().

Referenced by createRowArc().

◆ SPQRelementToColumn()

static spqr_col SPQRelementToColumn ( spqr_element  element)
static

Convert an element to the corresponding column index

Parameters
elementThe element to convert

Definition at line 232 of file network.c.

References SPQRelementIsColumn().

Referenced by columnTransformSingleRigid(), netMatDecDataCreateDiGraph(), and rigidTransformArcIntoCycle().

◆ SPQRcolumnToElement()

static spqr_element SPQRcolumnToElement ( spqr_col  column)
static

Convert a column to the corresponding element

Parameters
columnThe column to convert

Definition at line 242 of file network.c.

References SPQRcolIsValid().

Referenced by createColumnArc().

◆ SPQRmemberIsInvalid()

static SCIP_Bool SPQRmemberIsInvalid ( spqr_member  member)
static

Check if a member is invalid

Parameters
memberThe member to check

Definition at line 264 of file network.c.

Referenced by createArc(), findMemberParent(), findMemberParentNoCompression(), memberIsRepresentative(), netMatDecDataCreateDiGraph(), and SPQRmemberIsValid().

◆ SPQRmemberIsValid()

◆ SPQRnodeIsInvalid()

◆ SPQRnodeIsValid()

◆ SPQRarcIsInvalid()

◆ SPQRarcIsValid()

static SCIP_Bool SPQRarcIsValid ( spqr_arc  arc)
static

◆ nodeIsRepresentative()

static SCIP_Bool nodeIsRepresentative ( const SCIP_NETMATDECDATA dec,
spqr_node  node 
)
static

Check if a node is a representative in the union-find data structure for nodes

Parameters
decThe network decomposition
nodeThe node to check if it is representative

Definition at line 440 of file network.c.

References SCIP_NETMATDECDATA::nodes, SPQRNetworkDecompositionNode::representativeNode, SPQRnodeIsInvalid(), and SPQRnodeIsValid().

Referenced by addArcToNodeArcList(), changeArcHead(), changeArcTail(), determineRigidPath(), getNextNodeArc(), getNextNodeArcNoCompression(), getPreviousNodeArc(), mergeNodes(), rigidGetSplittableArticulationPointsOnPath(), splitAndMergeParallel(), and splitAndMergeSeries().

◆ findNode()

static spqr_node findNode ( SCIP_NETMATDECDATA dec,
spqr_node  node 
)
static

Find the node its representative node in the union-find data structure

Parameters
decThe network decomposition
nodeThe node to find the representative for

Definition at line 456 of file network.c.

References SCIP_NETMATDECDATA::nodes, SPQRNetworkDecompositionNode::representativeNode, and SPQRnodeIsValid().

Referenced by findArcHead(), findArcTail(), netcoladdAdd(), and netrowaddAdd().

◆ findNodeNoCompression()

static spqr_node findNodeNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_node  node 
)
static

Find the node its representative node in the union-find data structure, without compressing the union-find tree.

Should only be used for debugging or asserts.

Parameters
decThe network decomposition
nodeThe node to find the representative for

Definition at line 493 of file network.c.

References SCIP_NETMATDECDATA::nodes, SPQRNetworkDecompositionNode::representativeNode, and SPQRnodeIsValid().

Referenced by findArcHeadNoCompression(), and findArcTailNoCompression().

◆ findArcTail()

◆ findArcHead()

◆ findArcHeadNoCompression()

static spqr_node findArcHeadNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Find the arc's head node in the union find data structure of the nodes, without compressing the union-find tree.

Should only be used in debugging statements or asserts.

Parameters
decThe network decomposition
arcThe arc whose head we want to find

Definition at line 560 of file network.c.

References SCIP_NETMATDECDATA::arcs, findNodeNoCompression(), SPQRNetworkDecompositionArc::head, and SPQRarcIsValid().

Referenced by findEffectiveArcHeadNoCompression(), findEffectiveArcTailNoCompression(), getNextNodeArcNoCompression(), intersectionOfAllPaths(), and rigidConnectedColoring().

◆ findArcTailNoCompression()

static spqr_node findArcTailNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Find the arc's tail node in the union find data structure of the nodes, without compressing the union-find tree.

Should only be used in debugging statements or asserts.

Parameters
decThe network decomposition
arcThe arc whose tail we want to find

Definition at line 578 of file network.c.

References SCIP_NETMATDECDATA::arcs, findNodeNoCompression(), SPQRarcIsValid(), and SPQRNetworkDecompositionArc::tail.

Referenced by findEffectiveArcHeadNoCompression(), findEffectiveArcTailNoCompression(), getNextNodeArc(), getNextNodeArcNoCompression(), getPreviousNodeArc(), intersectionOfAllPaths(), and rigidConnectedColoring().

◆ getFirstNodeArc()

◆ getNextNodeArcNoCompression()

static spqr_arc getNextNodeArcNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_node  node 
)
static

Given the current arc adjacent to this node, find the next arc in the cyclic linked list of adjacent arcs to the given node.

This function does not compress the union-find tree, and should only be used in debugging or asserts.

Parameters
decThe network decomposition
arcThe current arc that is adjacent to this node
nodeThe node to which the arc is adjacent

Definition at line 614 of file network.c.

References SCIP_NETMATDECDATA::arcs, findArcHeadNoCompression(), findArcTailNoCompression(), SPQRNetworkDecompositionArc::headArcListNode, SPQRNetworkDecompositionArcListNode::next, nodeIsRepresentative(), SPQRarcIsValid(), and SPQRNetworkDecompositionArc::tailArcListNode.

Referenced by decompositionGetFundamentalCycleRows().

◆ getNextNodeArc()

◆ getPreviousNodeArc()

static spqr_arc getPreviousNodeArc ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_node  node 
)
static

Given the current arc adjacent to this node, find the previous arc in the cyclic linked list of adjacent arcs to the given node.

Parameters
decThe network decomposition
arcThe current arc that is adjacent to this node
nodeThe node to which the arc is adjacent

Definition at line 669 of file network.c.

References SCIP_NETMATDECDATA::arcs, findArcHead(), findArcTailNoCompression(), SPQRNetworkDecompositionArc::headArcListNode, nodeIsRepresentative(), SPQRNetworkDecompositionArcListNode::previous, SPQRarcIsValid(), SPQRNetworkDecompositionArc::tail, and SPQRNetworkDecompositionArc::tailArcListNode.

Referenced by mergeNodeArcList().

◆ mergeNodeArcList()

static void mergeNodeArcList ( SCIP_NETMATDECDATA dec,
spqr_node  toMergeInto,
spqr_node  toRemove 
)
static

Update the cyclic node-arc incidence data structure to move all arcs adjacent to one node to another node.

We typically call this when two nodes are identified with one another, and we need to merge their adjacent arcs.

Parameters
decThe network decomposition
toMergeIntoThe node that we want to give all the arcs of both nodes
toRemoveThe node whose arcs we want to remove

Definition at line 698 of file network.c.

References SCIP_NETMATDECDATA::arcs, findArcHead(), SPQRNetworkDecompositionNode::firstArc, getFirstNodeArc(), getPreviousNodeArc(), SPQRNetworkDecompositionArc::headArcListNode, SPQRNetworkDecompositionArcListNode::next, SCIP_NETMATDECDATA::nodes, SPQRNetworkDecompositionNode::numArcs, SPQRNetworkDecompositionArcListNode::previous, SPQR_INVALID_ARC, SPQRarcIsInvalid(), SPQRarcIsValid(), and SPQRNetworkDecompositionArc::tailArcListNode.

Referenced by mergeGivenMemberIntoParent(), mergeNodes(), and mergeSplitMemberIntoParent().

◆ arcFlipReversed()

static void arcFlipReversed ( SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Flips the direction a given arc.

Parameters
decThe network decomposition
arcThe arc that we want to flip

Definition at line 754 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::reversed, and SPQRarcIsValid().

Referenced by splitSeries().

◆ arcSetReversed()

static void arcSetReversed ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
SCIP_Bool  reversed 
)
static

Sets the direction of a given arc

Parameters
decThe network decomposition
arcThe given arc
reversedAre the head and tail reversed?

Definition at line 768 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::reversed, and SPQRarcIsValid().

Referenced by netcoladdAdd(), netrowaddAdd(), splitAndMergeParallel(), splitAndMergeSeries(), splitFirstLeaf(), transformAndMergeParallel(), transformAndMergeSeries(), and transformFirstPathMember().

◆ arcSetRepresentative()

static void arcSetRepresentative ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_arc  representative 
)
static

Sets the representative of a given arc.

The arcs reversed field is given with respect to the representative. In particular, whether an arc is reversed or not is determined by the sign of the path in the signed union-find data structure for arcs, which can be computed by multiplying the signs of the individual edges (xor over bools).

Parameters
decThe network decomposition
arcThe given arc
representativeThe representative to set the arc to

Definition at line 789 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::representative, SPQR_INVALID_ARC, and SPQRarcIsValid().

Referenced by netcoladdAdd(), netrowaddAdd(), splitAndMergeParallel(), splitAndMergeSeries(), splitFirstLeaf(), transformAndMergeParallel(), transformAndMergeSeries(), and transformFirstPathMember().

◆ mergeNodes()

static spqr_node mergeNodes ( SCIP_NETMATDECDATA dec,
spqr_node  first,
spqr_node  second 
)
static

Merge two representative nodes (Union operation) in the union-find data structure for nodes.

Returns the id of the node that becomes representative for both.

Parameters
decThe network decomposition
firstA node to merge
secondA second node to merge

Definition at line 808 of file network.c.

References mergeNodeArcList(), nodeIsRepresentative(), SCIP_NETMATDECDATA::nodes, SPQRNetworkDecompositionNode::representativeNode, and SCIPswapInts().

Referenced by mergeGivenMemberIntoParent(), and mergeSplitMemberIntoParent().

◆ memberIsRepresentative()

◆ findMember()

static spqr_member findMember ( SCIP_NETMATDECDATA dec,
spqr_member  member 
)
static

Find the member its representative member in the union-find data structure

Parameters
decThe network decomposition
memberThe member to find the representative for

Definition at line 855 of file network.c.

References SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::representativeMember, and SPQRmemberIsValid().

Referenced by checkLeaf(), determineSingleComponentType(), findArcChildMember(), findArcMember(), findMemberParent(), splitParallelMerging(), and splitSeriesMergingRowAddition().

◆ findMemberNoCompression()

static spqr_member findMemberNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_member  member 
)
static

Find the member's representative member in the union-find data structure, without compressing the union-find tree.

Should only be used for debugging or asserts.

Parameters
decThe network decomposition
memberThe member to find the representative for

Definition at line 892 of file network.c.

References SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::representativeMember, and SPQRmemberIsValid().

Referenced by findArcChildMemberNoCompression(), findArcMemberNoCompression(), findMemberParentNoCompression(), and updateMemberParentInformation().

◆ mergeMembers()

static spqr_member mergeMembers ( SCIP_NETMATDECDATA dec,
spqr_member  first,
spqr_member  second 
)
static

Merge two representative members (Union operation) in the union-find data structure.

Returns the id of the member that becomes representative for both.

Parameters
decThe network decomposition
firstThe first member to merge
secondThe second member to merge

Definition at line 920 of file network.c.

References memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::representativeMember, and SCIPswapInts().

Referenced by mergeGivenMemberIntoParent(), and mergeSplitMemberIntoParent().

◆ findArcMember()

static spqr_member findArcMember ( SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Finds the member in which the arc is located

Parameters
decThe network decomposition
arcThe arc to find the member for

Definition at line 951 of file network.c.

References SCIP_NETMATDECDATA::arcs, findMember(), SPQRNetworkDecompositionArc::member, and SPQRarcIsValid().

Referenced by constructReducedDecomposition(), constructRowReducedDecomposition(), createPathArcs(), createReducedDecompositionCutArcs(), and netMatDecDataCreateDiGraph().

◆ findArcMemberNoCompression()

static spqr_member findArcMemberNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Finds the member in which the arc is located, without compressing the member union-find tree

Parameters
decThe network decomposition
arcThe arc to find the member for

Definition at line 967 of file network.c.

References SCIP_NETMATDECDATA::arcs, findMemberNoCompression(), SPQRNetworkDecompositionArc::member, and SPQRarcIsValid().

Referenced by decompositionGetFundamentalCycleRows(), getRelativeOrientationParallel(), getRelativeOrientationRigid(), getRelativeOrientationSeries(), moveArcToNewMember(), process_arc(), removeArcFromMemberArcList(), splitAndMergeParallel(), and splitFirstLeaf().

◆ findMemberParent()

static spqr_member findMemberParent ( SCIP_NETMATDECDATA dec,
spqr_member  member 
)
static

Find the representative parent member of the given member.

Note the given member must be representative.

Parameters
decThe network decomposition
memberThe member to find the parent for. Must be representative.

Definition at line 985 of file network.c.

References findMember(), memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::parentMember, SPQRmemberIsInvalid(), and SPQRmemberIsValid().

Referenced by columnTransformSingleRigid(), constructReducedDecomposition(), constructRowReducedDecomposition(), createReducedMembersToRoot(), createRowReducedMembersToRoot(), determinePathTypes(), netMatDecDataCreateDiGraph(), reorderComponent(), rigidTransformArcIntoCycle(), splitParallelRowAddition(), and splitSeries().

◆ findMemberParentNoCompression()

static spqr_member findMemberParentNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_member  member 
)
static

Find the representative parent member of the given member.

Note the given member must be representative. This version does not perform compression of the union-find tree, and should only be used in debug or asserts.

Parameters
decThe network decomposition
memberThe member to find the parent for. Must be representative.

Definition at line 1011 of file network.c.

References findMemberNoCompression(), memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::parentMember, SPQRmemberIsInvalid(), and SPQRmemberIsValid().

Referenced by mergeGivenMemberIntoParent(), mergeSplitMemberIntoParent(), and netMatDecDataIsMinimal().

◆ findArcChildMember()

static spqr_member findArcChildMember ( SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Find the child member associated to the given arc, which must be virtual.

Parameters
decThe network decomposition
arcThe arc to find the child member for

Definition at line 1031 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::childMember, findMember(), and SPQRarcIsValid().

Referenced by columnTransformSingleRigid(), moveArcToNewMember(), netMatDecDataCreateDiGraph(), rigidTransformArcIntoCycle(), splitParallelRowAddition(), and splitSeries().

◆ findArcChildMemberNoCompression()

static spqr_member findArcChildMemberNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Find the child member associated to the given virtual arc.

This version does not compress the union-find tree and should only be used for debugging and asserts.

Parameters
decThe network decomposition
arcThe arc to find the child member for

Definition at line 1050 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::childMember, findMemberNoCompression(), and SPQRarcIsValid().

Referenced by moveArcToNewMember(), and process_arc().

◆ arcIsChildMarker()

static SCIP_Bool arcIsChildMarker ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Checks if the arc has a child member

Parameters
decThe network decomposition
arcThe arc to check

Definition at line 1065 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::childMember, SPQRarcIsValid(), and SPQRmemberIsValid().

Referenced by columnTransformSingleRigid(), netMatDecDataCreateDiGraph(), process_arc(), rigidTransformArcIntoCycle(), splitParallelRowAddition(), and splitSeries().

◆ arcIsTree()

◆ arcIsRepresentative()

static SCIP_Bool arcIsRepresentative ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Check if an arc is a representative in the signed union-find data structure for arc directions.

In each member, exactly one arc is the representative.

Parameters
decThe network decomposition
arcThe arc to check

Definition at line 1105 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::representative, SPQRarcIsInvalid(), and SPQRarcIsValid().

Referenced by mergeArcSigns().

◆ findArcSign()

◆ findArcSignNoCompression()

static ArcSign findArcSignNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Find an arcs representative and its direction in the signed union-find data structure for arcs.

This version does not compress the union-find tree and should only be used in debug and asserts.

Parameters
decThe network decomposition
arcThe arc to find the representative and direction for

Definition at line 1172 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::representative, ArcSign::representative, SPQRNetworkDecompositionArc::reversed, ArcSign::reversed, SCIP_Bool, and SPQRarcIsValid().

Referenced by findEffectiveArcHeadNoCompression(), and findEffectiveArcTailNoCompression().

◆ findEffectiveArcHead()

static spqr_node findEffectiveArcHead ( SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Finds the arcs head, taking into account whether it is reversed by the signed union-find data structure.

Parameters
decThe network decomposition
arcThe arc to find the head for

Definition at line 1201 of file network.c.

References findArcHead(), findArcSign(), and findArcTail().

Referenced by checkRigidLeaf(), createCutArc(), createPathArc(), determinePathRigidType(), getRelativeOrientationRigid(), mergeGivenMemberIntoParent(), mergeSplitMemberIntoParent(), splitAndMergeParallel(), splitAndMergeSeries(), and transformSingleRigid().

◆ findEffectiveArcTail()

static spqr_node findEffectiveArcTail ( SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Finds the arcs tail, taking into account whether it is reversed by the signed union-find data structure.

Parameters
decThe network decomposition
arcThe arc to find the tail for

Definition at line 1219 of file network.c.

References findArcHead(), findArcSign(), and findArcTail().

Referenced by checkRigidLeaf(), createCutArc(), createPathArc(), determinePathRigidType(), mergeGivenMemberIntoParent(), mergeSplitMemberIntoParent(), splitAndMergeParallel(), and splitAndMergeSeries().

◆ findEffectiveArcHeadNoCompression()

static spqr_node findEffectiveArcHeadNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Finds the arcs head, taking into account whether it is reversed by the signed union-find data structure.

This version does not compress the union-find tree and should only be used in debug and asserts.

Parameters
decThe network decomposition
arcThe arc to find the head for

Definition at line 1240 of file network.c.

References findArcHeadNoCompression(), findArcSignNoCompression(), and findArcTailNoCompression().

Referenced by decompositionGetFundamentalCycleRows(), netMatDecDataCreateDiGraph(), and transformSingleRigid().

◆ findEffectiveArcTailNoCompression()

static spqr_node findEffectiveArcTailNoCompression ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Finds the arcs tail, taking into account whether it is reversed by the signed union-find data structure.

This version does not compress the union-find tree and should only be used in debug and asserts.

Parameters
decThe network decomposition
arcThe arc to find the tail for

Definition at line 1262 of file network.c.

References findArcHeadNoCompression(), findArcSignNoCompression(), and findArcTailNoCompression().

Referenced by decompositionGetFundamentalCycleRows(), getRelativeOrientationRigid(), netMatDecDataCreateDiGraph(), and transformSingleRigid().

◆ mergeArcSigns()

static spqr_arc mergeArcSigns ( SCIP_NETMATDECDATA dec,
spqr_arc  first,
spqr_arc  second,
SCIP_Bool  reflectRelative 
)
static

Merges the sign union-find structures for two arc sets.

If reflectRelative is set to true then all arcs of the represented by the second arc are reversed w.r.t. their current orientation. Otherwise, all arcs keep the same reversed status with respect to the root node of the union find tree.

Parameters
decThe decomposition data structure
firstRepresentative arc of the first arc set
secondRepresentative arc of the second arc set
reflectRelativeShould all arcs in the second arc set be reversed?

Definition at line 1285 of file network.c.

References arcIsRepresentative(), SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::representative, SPQRNetworkDecompositionArc::reversed, SCIP_Bool, and SCIPswapInts().

Referenced by splitAndMergeParallel(), splitAndMergeRigid(), splitAndMergeSeries(), transformAndMergeParallel(), transformAndMergeRigid(), and transformAndMergeSeries().

◆ arcIsReversedNonRigid()

◆ arcGetElement()

static spqr_element arcGetElement ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Gets the element (row/column) associated to the given arc.

Parameters
decThe network decomposition
arcThe arc to get the element for

Definition at line 1343 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::element, and SPQRarcIsValid().

Referenced by columnTransformSingleRigid(), netMatDecDataCreateDiGraph(), process_arc(), and rigidTransformArcIntoCycle().

◆ netMatDecDataContainsRow()

static SCIP_Bool netMatDecDataContainsRow ( SCIP_NETMATDECDATA dec,
int  row 
)
static

Check whether the network matrix decomposition contains an edge for the given row index.

Parameters
decThe network matrix decomposition
rowThe row index that is checked

Definition at line 1357 of file network.c.

References SCIP_NETMATDECDATA::rowArcs, SPQRarcIsValid(), and SPQRrowIsValid().

Referenced by netMatDecDataCreateDiGraph(), netrowaddCheck(), and SCIPnetmatdecContainsRow().

◆ netMatDecDataContainsColumn()

static SCIP_Bool netMatDecDataContainsColumn ( SCIP_NETMATDECDATA dec,
int  column 
)
static

Check whether the network matrix decomposition contains an edge for the given column index.

Parameters
decThe network matrix decomposition
columnThe column index that is checked

Definition at line 1370 of file network.c.

References SCIP_NETMATDECDATA::columnArcs, SPQRarcIsValid(), and SPQRcolIsValid().

Referenced by netcoladdCheck(), and SCIPnetmatdecContainsColumn().

◆ setDecompositionColumnArc()

static void setDecompositionColumnArc ( SCIP_NETMATDECDATA dec,
spqr_col  col,
spqr_arc  arc 
)
static

Associate the given arc to the given column in the network matrix decomposition.

Parameters
decThe network matrix decomposition
colThe column to associate
arcThe arc to associate to the column

Definition at line 1383 of file network.c.

References SCIP_NETMATDECDATA::columnArcs, SPQRarcIsValid(), and SPQRcolIsValid().

Referenced by createColumnArc().

◆ setDecompositionRowArc()

static void setDecompositionRowArc ( SCIP_NETMATDECDATA dec,
spqr_row  row,
spqr_arc  arc 
)
static

Associate the given arc to the given row in the network matrix decomposition.

Parameters
decThe network matrix decomposition
rowThe row to associate
arcThe arc to associate to the row

Definition at line 1398 of file network.c.

References SCIP_NETMATDECDATA::rowArcs, SPQRarcIsValid(), and SPQRrowIsValid().

Referenced by createRowArc().

◆ getDecompositionColumnArc()

static spqr_arc getDecompositionColumnArc ( const SCIP_NETMATDECDATA dec,
spqr_col  col 
)
static

Get the decomposition arc associated to the given column.

Parameters
decThe network matrix decomposition
colThe given column

Definition at line 1413 of file network.c.

References SCIP_NETMATDECDATA::columnArcs, and SPQRcolIsValid().

Referenced by decompositionGetFundamentalCycleRows(), and newRowUpdateRowInformation().

◆ getDecompositionRowArc()

static spqr_arc getDecompositionRowArc ( const SCIP_NETMATDECDATA dec,
spqr_row  row 
)
static

Get the decomposition arc associated to the given row.

Parameters
decThe network matrix decomposition
rowThe given row

Definition at line 1426 of file network.c.

References SCIP_NETMATDECDATA::rowArcs, and SPQRrowIsValid().

Referenced by newColUpdateColInformation().

◆ netMatDecDataCreate()

◆ netMatDecDataFree()

static void netMatDecDataFree ( SCIP_NETMATDECDATA **  pdec)
static

◆ getFirstMemberArc()

◆ getNextMemberArc()

static spqr_arc getNextMemberArc ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

◆ getPreviousMemberArc()

static spqr_arc getPreviousMemberArc ( const SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Given the current arc, get the previous arc of the linked list of arcs that are in the same member.

Parameters
decThe network matrix decomposition
arcThe current arc

Definition at line 1561 of file network.c.

References SPQRNetworkDecompositionArc::arcListNode, SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArcListNode::previous, and SPQRarcIsValid().

Referenced by addArcToMemberArcList(), and mergeMemberArcList().

◆ addArcToMemberArcList()

static void addArcToMemberArcList ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_member  member 
)
static

◆ createArc()

◆ createRowArc()

static SCIP_RETCODE createRowArc ( SCIP_NETMATDECDATA dec,
spqr_member  member,
spqr_arc pArc,
spqr_row  row,
SCIP_Bool  reversed 
)
static

Create a new arc in the network matrix decomposition that is associated to the given row.

Parameters
decThe network matrix decomposition
memberThe member that contains the arc
pArcout-pointer to the id that is assigned to the arc.
rowThe row associated to the arc
reversedIs the arc reversed or not?

Definition at line 1656 of file network.c.

References addArcToMemberArcList(), SCIP_NETMATDECDATA::arcs, createArc(), SPQRNetworkDecompositionArc::element, SCIP_CALL, SCIP_OKAY, setDecompositionRowArc(), and SPQRrowToElement().

Referenced by columnTransformSingleRigid(), createConnectedParallel(), createConnectedSeries(), createStandaloneParallel(), createStandaloneSeries(), netrowaddAdd(), and rigidTransformArcIntoCycle().

◆ createColumnArc()

static SCIP_RETCODE createColumnArc ( SCIP_NETMATDECDATA dec,
spqr_member  member,
spqr_arc pArc,
spqr_col  column,
SCIP_Bool  reversed 
)
static

Create a new arc in the network matrix decomposition that is associated to the given column.

Parameters
decThe network matrix decomposition
memberThe member that contains the arc
pArcout-pointer to the id that is assigned to the arc.
columnThe column associated to the arc
reversedIs the arc reversed or not?

Definition at line 1674 of file network.c.

References addArcToMemberArcList(), SCIP_NETMATDECDATA::arcs, createArc(), SPQRNetworkDecompositionArc::element, SCIP_CALL, SCIP_OKAY, setDecompositionColumnArc(), and SPQRcolumnToElement().

Referenced by columnTransformSingleRigid(), createConnectedParallel(), createConnectedSeries(), createStandaloneParallel(), createStandaloneSeries(), netcoladdAdd(), and rigidTransformArcIntoCycle().

◆ createMember()

◆ createNode()

◆ removeArcFromNodeArcList()

static void removeArcFromNodeArcList ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_node  node,
SCIP_Bool  nodeIsHead 
)
static

Remove an arc from the linked list of arcs that are adjacent to a given node.

Parameters
decThe network matrix decomposition
arcThe arc to remove
nodeThe node to remove the arc from
nodeIsHeadIndicates whether the node is the arcs head, or tail

Definition at line 1746 of file network.c.

References SCIP_NETMATDECDATA::arcs, findArcHead(), SPQRNetworkDecompositionNode::firstArc, SPQRNetworkDecompositionArc::headArcListNode, SPQRNetworkDecompositionArcListNode::next, SCIP_NETMATDECDATA::nodes, SPQRNetworkDecompositionNode::numArcs, SPQRNetworkDecompositionArcListNode::previous, SPQR_INVALID_ARC, and SPQRNetworkDecompositionArc::tailArcListNode.

Referenced by changeArcHead(), changeArcTail(), and clearArcHeadAndTail().

◆ addArcToNodeArcList()

static void addArcToNodeArcList ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_node  node,
SCIP_Bool  nodeIsHead 
)
static

◆ setArcHeadAndTail()

static void setArcHeadAndTail ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_node  head,
spqr_node  tail 
)
static

Initializes the data structures of the arcs head and tail nodes.

Parameters
decThe network matrix decomposition
arcThe arc to initialize
headThe arc its head node
tailThe arc its tail node

Definition at line 1832 of file network.c.

References addArcToNodeArcList(), FALSE, and TRUE.

Referenced by netcoladdAdd(), netrowaddAdd(), splitAndMergeParallel(), splitAndMergeSeries(), splitFirstLeaf(), transformAndMergeParallel(), transformAndMergeSeries(), and transformFirstPathMember().

◆ clearArcHeadAndTail()

static void clearArcHeadAndTail ( SCIP_NETMATDECDATA dec,
spqr_arc  arc 
)
static

Deinitializes the data structures of the arcs head and tail nodes.

Parameters
decThe network matrix decomposition
arcThe arc to deinitialize

Definition at line 1845 of file network.c.

References SCIP_NETMATDECDATA::arcs, FALSE, findArcHead(), findArcTail(), SPQRNetworkDecompositionArc::head, removeArcFromNodeArcList(), SPQR_INVALID_NODE, SPQRNetworkDecompositionArc::tail, and TRUE.

Referenced by mergeGivenMemberIntoParent(), and mergeSplitMemberIntoParent().

◆ changeArcHead()

static void changeArcHead ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_node  oldHead,
spqr_node  newHead 
)
static

Change the arc's head node to a new node.

Parameters
decThe network matrix decomposition
arcThe given arc
oldHeadThe current head node of the arc
newHeadThe new head node of the arc

Definition at line 1858 of file network.c.

References addArcToNodeArcList(), nodeIsRepresentative(), removeArcFromNodeArcList(), and TRUE.

Referenced by splitAndMergeRigid(), splitFirstLeaf(), and transformSingleRigid().

◆ changeArcTail()

static void changeArcTail ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_node  oldTail,
spqr_node  newTail 
)
static

Change the arc's head node to a new node.

Parameters
decThe network matrix decomposition
arcThe given arc
oldTailThe current tail node of the arc
newTailThe new tail node of the arc

Definition at line 1874 of file network.c.

References addArcToNodeArcList(), FALSE, nodeIsRepresentative(), and removeArcFromNodeArcList().

Referenced by splitAndMergeRigid(), splitFirstLeaf(), and transformSingleRigid().

◆ nodeDegree()

static int nodeDegree ( SCIP_NETMATDECDATA dec,
spqr_node  node 
)
static

Returns the degree of the given node.

Parameters
decThe network matrix decomposition
nodeThe given node

Definition at line 1890 of file network.c.

References SCIP_NETMATDECDATA::nodes, SPQRNetworkDecompositionNode::numArcs, and SPQRnodeIsValid().

Referenced by rigidFindStarNodes(), and zeroOutColorsExceptNeighbourhood().

◆ getMemberType()

◆ updateMemberType()

static void updateMemberType ( const SCIP_NETMATDECDATA dec,
spqr_member  member,
SPQRMemberType  type 
)
static

Update the SPQR-type of the given member.

Parameters
decThe network matrix decomposition
memberThe member to update the type for
typeThe new SPQR-type of the member

Definition at line 1919 of file network.c.

References memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQRmemberIsValid(), and SPQRNetworkDecompositionMember::type.

Referenced by mergeGivenMemberIntoParent(), mergeSplitMemberIntoParent(), and splitFirstLeaf().

◆ markerToParent()

◆ updateMemberParentInformation()

static void updateMemberParentInformation ( SCIP_NETMATDECDATA dec,
const spqr_member  newMember,
const spqr_member  toRemove 
)
static

Updates the parent information of a member that is identified with another another member.

Parameters
decThe network matrix decomposition
newMemberThe new large member containing both members
toRemoveThe member that was merged and removed

Definition at line 1950 of file network.c.

References findMemberNoCompression(), SPQRNetworkDecompositionMember::markerOfParent, SPQRNetworkDecompositionMember::markerToParent, memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::parentMember, SPQR_INVALID_ARC, and SPQR_INVALID_MEMBER.

Referenced by mergeGivenMemberIntoParent(), and mergeSplitMemberIntoParent().

◆ markerOfParent()

◆ getNumMemberArcs()

◆ getNumNodes()

static int getNumNodes ( const SCIP_NETMATDECDATA dec)
static

Returns the number of nodes in complete network matrix decomposition.

Parameters
decThe network matrix decomposition

Definition at line 2000 of file network.c.

References SCIP_NETMATDECDATA::numNodes.

Referenced by allocateRigidSearchMemory(), and rigidGetSplittableArticulationPointsOnPath().

◆ getNumMembers()

static int getNumMembers ( const SCIP_NETMATDECDATA dec)
static

Returns the number of members in complete network matrix decomposition.

Parameters
decThe network matrix decomposition

Definition at line 2011 of file network.c.

References SCIP_NETMATDECDATA::numMembers.

Referenced by constructReducedDecomposition(), constructRowReducedDecomposition(), and createPathArcs().

◆ createStandaloneParallel()

static SCIP_RETCODE createStandaloneParallel ( SCIP_NETMATDECDATA dec,
spqr_col columns,
SCIP_Bool reversed,
int  num_columns,
spqr_row  row,
spqr_member pMember 
)
static

Creates a standalone parallel member with the given row and columns that is not connected to other members of the network matrix decomposition.

New arcs are created for the given row and columns.

Parameters
decThe network matrix decomposition
columnsThe columns in the parallel member
reversedArray indicating the direction of each column edge
num_columnsThe number of columns in the parallel member
rowThe row in the parallel member
pMemberout-pointer to the new parallel member id

Definition at line 2026 of file network.c.

References createColumnArc(), createMember(), createRowArc(), SCIP_NETMATDECDATA::numConnectedComponents, SCIP_CALL, SCIP_OKAY, SPQR_MEMBERTYPE_LOOP, and SPQR_MEMBERTYPE_PARALLEL.

Referenced by netrowaddAdd().

◆ createConnectedParallel()

static SCIP_RETCODE createConnectedParallel ( SCIP_NETMATDECDATA dec,
spqr_col columns,
SCIP_Bool reversed,
int  num_columns,
spqr_row  row,
spqr_member pMember 
)
static

Creates a parallel member with the given row and columns is connected to other members of the network matrix decomposition.

New arcs are created for the given row and columns.

Parameters
decThe network matrix decomposition
columnsThe columns in the parallel member
reversedArray indicating the direction of each column edge
num_columnsThe number of columns in the parallel member
rowThe row in the parallel member
pMemberout-pointer to the new parallel member id

Definition at line 2059 of file network.c.

References createColumnArc(), createMember(), createRowArc(), FALSE, SCIP_CALL, SCIP_OKAY, and SPQR_MEMBERTYPE_PARALLEL.

Referenced by netrowaddAdd().

◆ createStandaloneSeries()

static SCIP_RETCODE createStandaloneSeries ( SCIP_NETMATDECDATA dec,
spqr_row rows,
SCIP_Bool reversed,
int  numRows,
spqr_col  col,
spqr_member pMember 
)
static

Creates a standalone series member with the given row and columns that is not connected to other members of the network matrix decomposition.

New arcs are created for the given rows and column.

Parameters
decThe network matrix decomposition
rowsThe rows in the series member
reversedArray indicating the direction of each row edge
numRowsThe number of rows in the parallel member
colThe column in the parallel member
pMemberout-pointer to the new series member id

Definition at line 2090 of file network.c.

References createColumnArc(), createMember(), createRowArc(), FALSE, SCIP_NETMATDECDATA::numConnectedComponents, SCIP_CALL, SCIP_OKAY, SPQR_MEMBERTYPE_LOOP, and SPQR_MEMBERTYPE_SERIES.

Referenced by netcoladdAdd().

◆ createConnectedSeries()

static SCIP_RETCODE createConnectedSeries ( SCIP_NETMATDECDATA dec,
spqr_row rows,
SCIP_Bool reversed,
int  numRows,
spqr_col  col,
spqr_member pMember 
)
static

Creates a series member with the given row and columns that is connected to some other member of the network matrix decomposition.

New arcs are created for the given rows and column.

Parameters
decThe network matrix decomposition
rowsThe rows in the series member
reversedArray indicating the direction of each row edge
numRowsThe number of rows in the parallel member
colThe column in the parallel member
pMemberout-pointer to the new series member id

Definition at line 2122 of file network.c.

References createColumnArc(), createMember(), createRowArc(), FALSE, SCIP_CALL, SCIP_OKAY, and SPQR_MEMBERTYPE_SERIES.

Referenced by netcoladdAdd().

◆ removeArcFromMemberArcList()

static void removeArcFromMemberArcList ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_member  member 
)
static

◆ process_arc()

static void process_arc ( spqr_row cyclearcs,
int *  num_cycle_arcs,
FindCycleCall callStack,
int *  callStackSize,
spqr_arc  arc,
const SCIP_NETMATDECDATA dec,
SCIP_Bool cycledir,
SCIP_Bool  arcIsReversed 
)
static

Processes a single arc for the algorithm to find cycles in the network matrix decomposition.

if virtual, pushes it on the callstack, if non-virtual, adds it to the found cycle

Parameters
cyclearcsThe found cycle so far
num_cycle_arcsThe number of arcs in the cycle so far
callStackThe call stack of virtual edges to process still
callStackSizeThe number of virtual edges on the callstack
arcThe current arc to process
decThe network matrix decomposition
cycledirWhether the current arc is reversed w.r.t to the cycle/path
arcIsReversedThe arcIsReversed status from the network matrix decomposition

Definition at line 2191 of file network.c.

References FindCycleCall::arc, arcGetElement(), arcIsChildMarker(), arcIsTree(), findArcChildMemberNoCompression(), findArcMemberNoCompression(), markerOfParent(), markerToParent(), FindCycleCall::reversed, SPQRelementIsRow(), and SPQRelementToRow().

Referenced by decompositionGetFundamentalCycleRows().

◆ decompositionGetFundamentalCycleRows()

static int decompositionGetFundamentalCycleRows ( const SCIP_NETMATDECDATA dec,
spqr_col  column,
spqr_row output,
SCIP_Bool computedSignStorage 
)
static

Find the fundamental path of a cycle.

This is a slow method and only intended for debugging and testing.

Parameters
decThe network matrix decomposition
columnThe column to find the fundamental path for
outputpreallocated array to store fundamental path in. Must have at least the number of rows in the decomposition allocated
computedSignStorageBoolean array for storage of whether the path occurs forwards or backwards. Must have at least the same size as output array.

Definition at line 2241 of file network.c.

References FindCycleCall::arc, arcIsReversedNonRigid(), arcIsTree(), BMSallocBlockMemoryArray, BMSfreeBlockMemoryArray, SCIP_NETMATDECDATA::env, FALSE, findArcMemberNoCompression(), findEffectiveArcHeadNoCompression(), findEffectiveArcTailNoCompression(), getDecompositionColumnArc(), getFirstMemberArc(), getFirstNodeArc(), getMemberType(), getNextMemberArc(), getNextNodeArcNoCompression(), SCIP_NETMATDECDATA::memRows, DFSCallData::node, DFSCallData::nodeArc, NULL, SCIP_NETMATDECDATA::numNodes, process_arc(), FindCycleCall::reversed, SCIP_Bool, SCIPABORT, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, SPQR_MEMBERTYPE_UNASSIGNED, SPQRarcIsInvalid(), and TRUE.

Referenced by netMatDecDataVerifyCycle().

◆ netMatDecDataVerifyCycle()

static SCIP_Bool netMatDecDataVerifyCycle ( BMS_BUFMEM bufmem,
const SCIP_NETMATDECDATA dec,
int  column,
const int *  nonzrowidx,
const double *  nonzvals,
int  num_rows,
int *  pathrowstorage,
SCIP_Bool pathsignstorage 
)
static

Given a cycle (e.g. a matrix column), checks if the column's cycle matches the cycle in the network matrix decomposition.

Parameters
bufmemBuffer memory
decThe network matrix decomposition
columnThe column to check
nonzrowidxArray with the nonzero row indices of the column
nonzvalsArray with the nonzero entry values of the column's row indices
num_rowsThe number of nonzeros in the column
pathrowstorageTemporary storage vector for storing the fundamental path. Must have at least as many entries allocated as the number of rows in dec.
pathsignstorageTemporary storage for the fundamental path directions. Must have at least as many entries allocated as the number of rows in dec.

Definition at line 2432 of file network.c.

References BMSallocBufferMemoryArray, BMSfreeBufferMemoryArray, decompositionGetFundamentalCycleRows(), FALSE, NULL, SCIP_Bool, SCIPsortIntInt(), and TRUE.

Referenced by SCIPnetmatdecVerifyCycle().

◆ largestMemberID()

static spqr_member largestMemberID ( const SCIP_NETMATDECDATA dec)
static

Returns the largest member id that is currently in the decomposition.

Parameters
decThe network matrix decomposition

Definition at line 2518 of file network.c.

References SCIP_NETMATDECDATA::numMembers.

Referenced by constructReducedDecomposition(), constructRowReducedDecomposition(), and netMatDecDataCreateDiGraph().

◆ largestArcID()

static spqr_arc largestArcID ( const SCIP_NETMATDECDATA dec)
static

Returns the largest arc id that is currently in the decomposition.

Parameters
decThe network matrix decomposition

Definition at line 2527 of file network.c.

References SCIP_NETMATDECDATA::numArcs.

Referenced by createPathArcs(), and createReducedDecompositionCutArcs().

◆ largestNodeID()

static spqr_node largestNodeID ( const SCIP_NETMATDECDATA dec)
static

Returns the largest node id that is currently in the decomposition.

Parameters
decThe network matrix decomposition

Definition at line 2536 of file network.c.

References SCIP_NETMATDECDATA::numNodes.

Referenced by allocateRigidSearchMemory(), createPathArcs(), and netMatDecDataCreateDiGraph().

◆ numConnectedComponents()

static int numConnectedComponents ( const SCIP_NETMATDECDATA dec)
static

Returns the number of SPQR trees in the SPQR forest, i.e. the number of connected components.

Parameters
decThe network matrix decomposition

Definition at line 2545 of file network.c.

References SCIP_NETMATDECDATA::numConnectedComponents.

Referenced by constructReducedDecomposition(), constructRowReducedDecomposition(), netcoladdAdd(), and netrowaddAdd().

◆ createChildMarker()

static SCIP_RETCODE createChildMarker ( SCIP_NETMATDECDATA dec,
spqr_member  member,
spqr_member  child,
SCIP_Bool  isTree,
spqr_arc pArc,
SCIP_Bool  reversed 
)
static

Creates a child marker in the network decomposition.

Parameters
decThe network matrix decomposition
memberThe member to create the arc in
childThe member that the arc points to
isTreeIndicates if the new arc is a tree arc
pArcOut-pointer to store the new arc's id
reversedSets the reversed field of the arc

Definition at line 2554 of file network.c.

References addArcToMemberArcList(), SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::childMember, createArc(), SPQRNetworkDecompositionArc::element, MARKER_COLUMN_ELEMENT, MARKER_ROW_ELEMENT, SCIP_CALL, and SCIP_OKAY.

Referenced by columnTransformSingleRigid(), createMarkerPair(), createMarkerPairWithReferences(), and rigidTransformArcIntoCycle().

◆ createParentMarker()

static SCIP_RETCODE createParentMarker ( SCIP_NETMATDECDATA dec,
spqr_member  member,
SCIP_Bool  isTree,
spqr_member  parent,
spqr_arc  parentMarker,
spqr_arc arc,
SCIP_Bool  reversed 
)
static

Creates a parent marker in the network decomposition.

Parameters
decThe network matrix decomposition
memberThe member to create the arc in
isTreeIndicates if the new arc is a tree arc
parentThe member that the arc points to
parentMarkerThe parent arc in the parent that points to this member
arcOut-pointer to store the new arc's id
reversedSets the reversed field of the arc

Definition at line 2574 of file network.c.

References addArcToMemberArcList(), SCIP_NETMATDECDATA::arcs, createArc(), SPQRNetworkDecompositionArc::element, MARKER_COLUMN_ELEMENT, MARKER_ROW_ELEMENT, SPQRNetworkDecompositionMember::markerOfParent, SPQRNetworkDecompositionMember::markerToParent, SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::parentMember, SCIP_CALL, and SCIP_OKAY.

Referenced by columnTransformSingleRigid(), createMarkerPair(), createMarkerPairWithReferences(), and rigidTransformArcIntoCycle().

◆ createMarkerPair()

static SCIP_RETCODE createMarkerPair ( SCIP_NETMATDECDATA dec,
spqr_member  parentMember,
spqr_member  childMember,
SCIP_Bool  parentIsTree,
SCIP_Bool  childMarkerReversed,
SCIP_Bool  parentMarkerReversed 
)
static

Creates a child-marker parent-marker pair in the network decomposition.

Parameters
decThe network matrix decomposition
parentMemberThe parent member
childMemberThe child member
parentIsTreeIs the edge in the parent member (the child marker) a tree edge?
childMarkerReversedIs the child marker arc reversed?
parentMarkerReversedIS the parent marker arc reversed?

Definition at line 2598 of file network.c.

References createChildMarker(), createParentMarker(), SCIP_CALL, SCIP_OKAY, and SPQR_INVALID_ARC.

Referenced by splitParallel(), splitParallelRowAddition(), and splitSeries().

◆ createMarkerPairWithReferences()

static SCIP_RETCODE createMarkerPairWithReferences ( SCIP_NETMATDECDATA dec,
spqr_member  parentMember,
spqr_member  childMember,
SCIP_Bool  parentIsTree,
SCIP_Bool  childMarkerReversed,
SCIP_Bool  parentMarkerReversed,
spqr_arc parentToChild,
spqr_arc childToParent 
)
static

Creates a child-marker parent-marker pair in the network decomposition, and returns the assigned arc id's.

Parameters
decThe network matrix decomposition
parentMemberThe parent member
childMemberThe child member
parentIsTreeIs the edge in the parent member (the child marker) a tree edge?
childMarkerReversedIs the child marker arc reversed?
parentMarkerReversedIS the parent marker arc reversed?
parentToChildOutput-pointer containing arc id of the arc in the parent member
childToParentOutput-pointer containing arc id of the arc in the child member

Definition at line 2619 of file network.c.

References createChildMarker(), createParentMarker(), SCIP_CALL, and SCIP_OKAY.

Referenced by netcoladdAdd(), netrowaddAdd(), splitParallelMerging(), splitSeriesMerging(), and splitSeriesMergingRowAddition().

◆ moveArcToNewMember()

static void moveArcToNewMember ( SCIP_NETMATDECDATA dec,
spqr_arc  arc,
spqr_member  oldMember,
spqr_member  newMember 
)
static

Moves a given arc from one member to another, updating the linked lists it is contained in and the parent/child information of the relevant members.

Parameters
decThe network matrix decomposition
arcThe arc to move
oldMemberThe member that currently contains the arc
newMemberThe member to move the arc to

Definition at line 2641 of file network.c.

References addArcToMemberArcList(), SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::childMember, findArcChildMember(), findArcChildMemberNoCompression(), findArcMemberNoCompression(), SPQRNetworkDecompositionMember::markerOfParent, SPQRNetworkDecompositionMember::markerToParent, SPQRNetworkDecompositionArc::member, memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::parentMember, removeArcFromMemberArcList(), SPQRarcIsValid(), and SPQRmemberIsValid().

Referenced by netcoladdAdd(), netrowaddAdd(), splitParallel(), splitParallelMerging(), splitParallelRowAddition(), splitSeries(), splitSeriesMerging(), and splitSeriesMergingRowAddition().

◆ mergeMemberArcList()

static void mergeMemberArcList ( SCIP_NETMATDECDATA dec,
spqr_member  toMergeInto,
spqr_member  toRemove 
)
static

Merges the arc linked list of two members into one linked list.

Parameters
decThe network matrix decomposition
toMergeIntoThe member id that gets the new large linked list containing both
toRemoveThe member id that is invalidated, whose linked list is moved away.

Definition at line 2683 of file network.c.

References SPQRNetworkDecompositionArc::arcListNode, SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionMember::firstArc, getFirstMemberArc(), getPreviousMemberArc(), SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionArcListNode::next, SPQRNetworkDecompositionMember::numArcs, SPQRNetworkDecompositionArcListNode::previous, SPQR_INVALID_ARC, and SPQRarcIsValid().

Referenced by mergeGivenMemberIntoParent(), and mergeSplitMemberIntoParent().

◆ changeLoopToSeries()

static void changeLoopToSeries ( SCIP_NETMATDECDATA dec,
spqr_member  member 
)
static

Changes the type of a member from loop to series.

Parameters
decThe network matrix decomposition
memberThe member whose type is changed

Definition at line 2711 of file network.c.

References getMemberType(), getNumMemberArcs(), memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_SERIES, SPQRmemberIsValid(), and SPQRNetworkDecompositionMember::type.

Referenced by netrowaddAdd(), splitParallelRowAddition(), and transformComponentRowAddition().

◆ changeLoopToParallel()

static void changeLoopToParallel ( SCIP_NETMATDECDATA dec,
spqr_member  member 
)
static

Changes the type of a member from loop to parallel.

Parameters
decThe network matrix decomposition
memberThe member whose type is changed

Definition at line 2729 of file network.c.

References getMemberType(), getNumMemberArcs(), memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_SERIES, SPQRmemberIsValid(), and SPQRNetworkDecompositionMember::type.

Referenced by netcoladdAdd(), and splitSeries().

◆ netMatDecDataIsMinimal()

static SCIP_Bool netMatDecDataIsMinimal ( const SCIP_NETMATDECDATA dec)
static

Checks if the network decomposition is minimal, i.e. if it does not contain two adjacent parallel or series members.

Parameters
decThe network matrix decomposition

Definition at line 2749 of file network.c.

References FALSE, findMemberParentNoCompression(), getMemberType(), memberIsRepresentative(), SCIP_NETMATDECDATA::numMembers, SCIP_Bool, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_UNASSIGNED, SPQRmemberIsValid(), and TRUE.

Referenced by SCIPnetmatdecIsMinimal().

◆ decreaseNumConnectedComponents()

static void decreaseNumConnectedComponents ( SCIP_NETMATDECDATA dec,
int  by 
)
static

Decreases the count of the number of connected components in the network matrix decomposition.

Parameters
decThe network matrix decomposition
byThe number of connected components to remove.

Definition at line 2779 of file network.c.

References SCIP_NETMATDECDATA::numConnectedComponents.

Referenced by netcoladdAdd(), and netrowaddAdd().

◆ reorderComponent()

static void reorderComponent ( SCIP_NETMATDECDATA dec,
spqr_member  newRoot 
)
static

Reorders the arborescence of the SPQR that contains a given member so that the given member becomes the new root of the arborescence.

Parameters
decThe network matrix decomposition
newRootThe member to make the new root

Definition at line 2792 of file network.c.

References SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::childMember, findMemberParent(), SPQRNetworkDecompositionMember::markerOfParent, SPQRNetworkDecompositionMember::markerToParent, memberIsRepresentative(), SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::parentMember, SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQRmemberIsValid(), and TRUE.

Referenced by netcoladdAdd(), and netrowaddAdd().

◆ netMatDecDataRemoveComponent()

static void netMatDecDataRemoveComponent ( SCIP_NETMATDECDATA dec,
const int *  componentRows,
int  numRows,
const int *  componentCols,
int  numCols 
)
static

Deletes the SPQR tree (connected component) containing the given component rows and columns.

Note that the implementation of this method does not actually modify the SPQR tree, but rather unlinks the rows and columns from the relevant arcs. Thus, this method is a bit hacky and should be used with care.

Parameters
decThe network matrix decomposition
componentRowsThe rows of the connected component
numRowsThe number of rows
componentColsThe columns of the connected component
numColsThe number of columns

Definition at line 2847 of file network.c.

References SCIP_NETMATDECDATA::columnArcs, SCIP_NETMATDECDATA::rowArcs, SPQR_INVALID_ARC, and SPQRarcIsValid().

Referenced by SCIPnetmatdecRemoveComponent().

◆ mergeGivenMemberIntoParent()

static SCIP_RETCODE mergeGivenMemberIntoParent ( SCIP_NETMATDECDATA dec,
spqr_member  member,
spqr_member  parent,
spqr_arc  parentToChild,
spqr_arc  childToParent,
SCIP_Bool  headToHead,
spqr_member mergedMember 
)
static
Parameters
decThe network matrix decomposition
memberThe member to merge
parentThe parent of the member to merge into
parentToChildThe arc from the parent pointing to the member
childToParentThe arc in the child pointing to the parent
headToHeadIdentify the head of parentToChild with the head of childToParent?
mergedMemberOut-pointer to the member id of the final member

Definition at line 3052 of file network.c.

References clearArcHeadAndTail(), findEffectiveArcHead(), findEffectiveArcTail(), findMemberParentNoCompression(), markerOfParent(), markerToParent(), memberIsRepresentative(), mergeMemberArcList(), mergeMembers(), mergeNodeArcList(), mergeNodes(), removeArcFromMemberArcList(), SCIP_OKAY, SPQR_MEMBERTYPE_RIGID, SPQRmemberIsValid(), updateMemberParentInformation(), and updateMemberType().

Referenced by transformAndMergeParallel(), transformAndMergeRigid(), and transformAndMergeSeries().

◆ netMatDecDataCreateDiGraph()

◆ pathArcIsInvalid()

static SCIP_Bool pathArcIsInvalid ( const path_arc_id  arc)
static

Returns true if the path arc is invalid.

Parameters
arcThe path arc to check

Definition at line 3443 of file network.c.

Referenced by determinePathRigidType(), and pathArcIsValid().

◆ pathArcIsValid()

static SCIP_Bool pathArcIsValid ( const path_arc_id  arc)
static

◆ reducedMemberIsInvalid()

static SCIP_Bool reducedMemberIsInvalid ( const reduced_member_id  id)
static

◆ reducedMemberIsValid()

◆ isInto()

static SCIP_Bool isInto ( MemberPathType  type)
static

Check if the path type is into.

Parameters
typeThe path type to check

Definition at line 3528 of file network.c.

References INTO_HEAD, and INTO_TAIL.

Referenced by determinePathParallelType(), determinePathRigidType(), determinePathSeriesType(), transformAndMergeRigid(), and transformAndMergeSeries().

◆ isHead()

static SCIP_Bool isHead ( MemberPathType  type)
static

Check if the path end node is the head or tail node of the corresponding arc.

Parameters
typeThe path type to check

Definition at line 3537 of file network.c.

References INTO_HEAD, and OUT_HEAD.

Referenced by determinePathParallelType(), determinePathRigidType(), determinePathSeriesType(), and transformAndMergeSeries().

◆ cleanupPreviousIteration()

static void cleanupPreviousIteration ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol 
)
static

◆ netcoladdCreate()

static SCIP_RETCODE netcoladdCreate ( BMS_BLKMEM blkmem,
SCIP_NETCOLADD **  pcoladd 
)
static

Create a new network column addition datastructure.

Parameters
blkmemBlock memory
pcoladdOut-pointer for the created network column addition datastructure

Definition at line 3725 of file network.c.

References SCIP_NETCOLADD::arcInPath, SCIP_NETCOLADD::arcInPathReversed, BMSallocBlockMemory, SCIP_NETCOLADD::childrenStorage, SCIP_NETCOLADD::createReducedMembersCallStack, SCIP_NETCOLADD::decompositionArcReversed, SCIP_NETCOLADD::decompositionRowArcs, FALSE, SCIP_NETCOLADD::firstOverallPathArc, INVALID_PATH_ARC, SCIP_NETCOLADD::leafMembers, SCIP_NETCOLADD::memArcsInPath, SCIP_NETCOLADD::memberInformation, SCIP_NETCOLADD::memChildrenStorage, SCIP_NETCOLADD::memCreateReducedMembersCallStack, SCIP_NETCOLADD::memDecompositionRowArcs, SCIP_NETCOLADD::memLeafMembers, SCIP_NETCOLADD::memMemberInformation, SCIP_NETCOLADD::memNewRowArcs, SCIP_NETCOLADD::memNodePathDegree, SCIP_NETCOLADD::memPathArcs, SCIP_NETCOLADD::memReducedComponents, SCIP_NETCOLADD::memReducedMembers, SCIP_NETCOLADD::newColIndex, SCIP_NETCOLADD::newRowArcReversed, SCIP_NETCOLADD::newRowArcs, SCIP_NETCOLADD::nodeInPathDegree, SCIP_NETCOLADD::nodeOutPathDegree, NULL, SCIP_NETCOLADD::numChildrenStorage, SCIP_NETCOLADD::numDecompositionRowArcs, SCIP_NETCOLADD::numLeafMembers, SCIP_NETCOLADD::numMemberInformation, SCIP_NETCOLADD::numNewRowArcs, SCIP_NETCOLADD::numPathArcs, SCIP_NETCOLADD::numReducedComponents, SCIP_NETCOLADD::numReducedMembers, SCIP_NETCOLADD::pathArcs, SCIP_NETCOLADD::reducedComponents, SCIP_NETCOLADD::reducedMembers, SCIP_NETCOLADD::remainsNetwork, SCIP_ALLOC, SCIP_OKAY, and SPQR_INVALID_COL.

Referenced by SCIPnetmatdecTryAddCol().

◆ netcoladdFree()

◆ createReducedMembersToRoot()

static reduced_member_id createReducedMembersToRoot ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
const spqr_member  firstMember 
)
static

Adds members to the reduced member tree, by starting at the given member, jumping up to the parent, repeating this procedure until the root has been added.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
firstMemberThe member to create a reduced member for

Definition at line 3820 of file network.c.

References SPQRColReducedMember::componentIndex, SCIP_NETCOLADD::createReducedMembersCallStack, SPQRColReducedMember::depth, findMemberParent(), SPQRColReducedMember::firstPathArc, INVALID_PATH_ARC, INVALID_REDUCED_MEMBER, SPQRColReducedMember::member, CreateReducedMembersCallstack::member, SCIP_NETCOLADD::memberInformation, memberIsRepresentative(), SCIP_NETCOLADD::memReducedComponents, SPQRColReducedMember::numChildren, SPQRColReducedMember::numPathArcs, SPQRColReducedComponent::numPathEndMembers, SPQRColReducedMember::numPropagatedChildren, SCIP_NETCOLADD::numReducedComponents, SCIP_NETCOLADD::numReducedMembers, SPQRColReducedMember::parent, SPQRColReducedComponent::pathEndMembers, SCIP_NETCOLADD::reducedComponents, MemberInfo::reducedMember, REDUCEDMEMBER_TYPE_UNASSIGNED, reducedMemberIsInvalid(), reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, SPQRColReducedMember::rigidPathEnd, SPQRColReducedMember::rigidPathStart, SPQRColReducedComponent::root, MemberInfo::rootDepthMinimizer, SPQRColReducedMember::rootMember, SCIP_Bool, SPQR_INVALID_NODE, SPQRmemberIsValid(), TRUE, and SPQRColReducedMember::type.

Referenced by constructReducedDecomposition().

◆ constructReducedDecomposition()

static SCIP_RETCODE constructReducedDecomposition ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol 
)
static

Construct the reduced decomposition, which is the smallest subtree containing all members path arcs.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure

Definition at line 3932 of file network.c.

References BMSreallocBlockMemoryArray, SCIP_NETCOLADD::childrenStorage, SCIP_NETCOLADD::createReducedMembersCallStack, createReducedMembersToRoot(), SCIP_NETCOLADD::decompositionRowArcs, SPQRColReducedMember::depth, SCIP_NETMATDECDATA::env, findArcMember(), findMemberParent(), SPQRColReducedMember::firstChild, getNumMembers(), INVALID_REDUCED_MEMBER, largestMemberID(), MAX, SPQRColReducedMember::member, SCIP_NETCOLADD::memberInformation, memberIsRepresentative(), SCIP_NETCOLADD::memChildrenStorage, SCIP_NETCOLADD::memCreateReducedMembersCallStack, SCIP_NETCOLADD::memMemberInformation, SCIP_NETCOLADD::memReducedComponents, SCIP_NETCOLADD::memReducedMembers, SPQRColReducedMember::numChildren, SCIP_NETCOLADD::numChildrenStorage, numConnectedComponents(), SCIP_NETCOLADD::numDecompositionRowArcs, SCIP_NETCOLADD::numReducedComponents, SCIP_NETCOLADD::numReducedMembers, SPQRColReducedMember::parent, SCIP_NETCOLADD::reducedComponents, MemberInfo::reducedMember, reducedMemberIsInvalid(), reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, SPQRColReducedComponent::root, SPQRColReducedComponent::rootDepth, MemberInfo::rootDepthMinimizer, SPQRColReducedMember::rootMember, SCIP_ALLOC, SCIP_OKAY, and SPQRmemberIsValid().

Referenced by netcoladdCheck().

◆ cleanUpMemberInformation()

static void cleanUpMemberInformation ( SCIP_NETCOLADD newCol)
static

Clean up the memberinformation array at the end of an iteration.

Parameters
newColThe network matrix column addition data structure

Definition at line 4079 of file network.c.

References INVALID_REDUCED_MEMBER, SPQRColReducedMember::member, SCIP_NETCOLADD::memberInformation, SCIP_NETCOLADD::memMemberInformation, SCIP_NETCOLADD::numReducedMembers, MemberInfo::reducedMember, reducedMemberIsInvalid(), and SCIP_NETCOLADD::reducedMembers.

Referenced by netcoladdCheck().

◆ createPathArc()

static void createPathArc ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
const spqr_arc  arc,
const reduced_member_id  reducedMember,
SCIP_Bool  reversed 
)
static

◆ createPathArcs()

◆ newColUpdateColInformation()

static SCIP_RETCODE newColUpdateColInformation ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
spqr_col  column,
const spqr_row nonzeroRows,
const double *  nonzeroValues,
int  numNonzeros 
)
static

Saves the information of the current row and partitions it based on whether or not the given columns are already part of the decomposition.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
columnThe column that is checked
nonzeroRowsThe column's row indices
nonzeroValuesThe column's nonzero values
numNonzerosThe number of nonzeros in the column

Definition at line 4206 of file network.c.

References BMSreallocBlockMemoryArray, SCIP_NETCOLADD::decompositionArcReversed, SCIP_NETCOLADD::decompositionRowArcs, SCIP_NETMATDECDATA::env, getDecompositionRowArc(), SCIP_NETCOLADD::memDecompositionRowArcs, SCIP_NETCOLADD::memNewRowArcs, SCIP_NETCOLADD::newColIndex, SCIP_NETCOLADD::newRowArcReversed, SCIP_NETCOLADD::newRowArcs, SCIP_NETCOLADD::numDecompositionRowArcs, SCIP_NETCOLADD::numNewRowArcs, SCIP_ALLOC, SCIP_Bool, SCIP_OKAY, and SPQRarcIsValid().

Referenced by netcoladdCheck().

◆ computeLeafMembers()

static SCIP_RETCODE computeLeafMembers ( const SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol 
)
static

Compute and store the leaf members of the reduced SPQR forest

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure

Definition at line 4262 of file network.c.

References BMSreallocBlockMemoryArray, SCIP_NETMATDECDATA::env, SCIP_NETCOLADD::leafMembers, MAX, SCIP_NETCOLADD::memLeafMembers, SPQRColReducedMember::numChildren, SCIP_NETCOLADD::numLeafMembers, SCIP_NETCOLADD::numReducedMembers, SCIP_NETCOLADD::reducedMembers, SCIP_ALLOC, and SCIP_OKAY.

Referenced by netcoladdCheck().

◆ determineRigidPath()

static void determineRigidPath ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
SPQRColReducedMember redMem 
)
static

◆ determineSingleRigidType()

static void determineSingleRigidType ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  reducedMember 
)
static

Determines the member's type for the case where the reduced tree consists of a single rigid member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberThe reduced member to check

Definition at line 4353 of file network.c.

References determineRigidPath(), SPQRColReducedMember::firstPathArc, pathArcIsValid(), REDUCEDMEMBER_TYPE_MERGED, REDUCEDMEMBER_TYPE_NOT_NETWORK, reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, and SPQRColReducedMember::type.

Referenced by determineSingleComponentType().

◆ determineSingleComponentType()

◆ determinePathSeriesType()

static void determinePathSeriesType ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  reducedMember,
spqr_member  member,
MemberPathType  previousType,
spqr_arc  source,
spqr_arc  target 
)
static

Determines the path type of a series member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberThe reduced member to check
memberThe reduced member's member id
previousTypeType of the previous reduced member in the path
sourceThe marker connecting to the previous reduced member in the path
targetThe marker connecting to the next reduced member in the path

Definition at line 4473 of file network.c.

References PathArcListNode::arc, arcIsReversedNonRigid(), FALSE, SPQRColReducedMember::firstPathArc, getMemberType(), INTO_HEAD, INTO_TAIL, isHead(), isInto(), memberIsRepresentative(), PathArcListNode::nextMember, OUT_HEAD, OUT_TAIL, pathArcIsValid(), SCIP_NETCOLADD::pathArcs, SPQRColReducedMember::pathBackwards, SPQRColReducedMember::pathType, REDUCEDMEMBER_TYPE_NOT_NETWORK, reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, SCIP_NETCOLADD::remainsNetwork, PathArcListNode::reversed, SCIP_Bool, SPQR_MEMBERTYPE_SERIES, SPQRarcIsValid(), SPQRmemberIsValid(), TRUE, and SPQRColReducedMember::type.

Referenced by determinePathMemberType().

◆ determinePathParallelType()

static void determinePathParallelType ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  reducedMember,
spqr_member  member,
MemberPathType  previousType,
spqr_arc  source,
spqr_arc  target 
)
static

Determines the path type of a parallel member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberThe reduced member to check
memberThe reduced member's member id
previousTypeType of the previous reduced member in the path
sourceThe marker connecting to the previous reduced member in the path
targetThe marker connecting to the next reduced member in the path

Definition at line 4599 of file network.c.

References PathArcListNode::arc, arcIsReversedNonRigid(), FALSE, SPQRColReducedMember::firstPathArc, getMemberType(), INTO_HEAD, INTO_TAIL, isHead(), isInto(), memberIsRepresentative(), OUT_HEAD, OUT_TAIL, pathArcIsValid(), SCIP_NETCOLADD::pathArcs, SPQRColReducedMember::pathType, REDUCEDMEMBER_TYPE_NOT_NETWORK, reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, SCIP_NETCOLADD::remainsNetwork, PathArcListNode::reversed, SCIP_Bool, SPQR_MEMBERTYPE_PARALLEL, SPQRarcIsValid(), SPQRmemberIsValid(), TRUE, and SPQRColReducedMember::type.

Referenced by determinePathMemberType().

◆ determinePathRigidType()

static void determinePathRigidType ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  reducedMember,
MemberPathType  previousType,
spqr_arc  source,
spqr_arc  target 
)
static

Determines the path type of a rigid member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberThe reduced member to check
previousTypeType of the previous reduced member in the path
sourceThe marker connecting to the previous reduced member in the path
targetThe marker connecting to the next reduced member in the path

Definition at line 4669 of file network.c.

References determineRigidPath(), FALSE, findEffectiveArcHead(), findEffectiveArcTail(), SPQRColReducedMember::firstPathArc, INTO_HEAD, INTO_TAIL, isHead(), isInto(), OUT_HEAD, OUT_TAIL, pathArcIsInvalid(), SPQRColReducedMember::pathType, REDUCEDMEMBER_TYPE_NOT_NETWORK, SCIP_NETCOLADD::reducedMembers, SCIP_NETCOLADD::remainsNetwork, SPQRColReducedMember::reverseArcs, SPQRColReducedMember::rigidPathEnd, SPQRColReducedMember::rigidPathStart, SCIP_Bool, SPQRarcIsInvalid(), SPQRarcIsValid(), TRUE, and SPQRColReducedMember::type.

Referenced by determinePathMemberType().

◆ determinePathMemberType()

static void determinePathMemberType ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  reducedMember,
spqr_member  member,
MemberPathType  previousType,
spqr_arc  source,
spqr_arc  target 
)
static

Determines the path type of a single member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberThe reduced member to check
memberThe reduced member's member id
previousTypeType of the previous reduced member in the path
sourceThe marker connecting to the previous reduced member in the path
targetThe marker connecting to the next reduced member in the path

Definition at line 5008 of file network.c.

References determinePathParallelType(), determinePathRigidType(), determinePathSeriesType(), FALSE, getMemberType(), SPQRColReducedMember::pathSourceArc, SPQRColReducedMember::pathTargetArc, SCIP_NETCOLADD::reducedMembers, SCIP_NETCOLADD::remainsNetwork, SCIPABORT, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, and SPQR_MEMBERTYPE_UNASSIGNED.

Referenced by determinePathTypes().

◆ determinePathTypes()

◆ checkRigidLeaf()

static void checkRigidLeaf ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  leaf,
spqr_arc  toParent,
reduced_member_id  parent,
spqr_arc  toChild 
)
static

Check if a rigid leaf closes a cycle with its child.

If so, we can propagate this cycle to a virtual arc of the child node member and shrink the decomposition.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
leafThe leaf node of the reduced SPQR tree
toParentThe virtual arc to the leaf node's neighbour
parentThe neighbouring member of the leaf node.
toChildThe virtual arc from the neighbouring member pointing to the leaf.

Definition at line 5144 of file network.c.

References createPathArc(), determineRigidPath(), findEffectiveArcHead(), findEffectiveArcTail(), REDUCEDMEMBER_TYPE_CYCLE, REDUCEDMEMBER_TYPE_MERGED, REDUCEDMEMBER_TYPE_NOT_NETWORK, SCIP_NETCOLADD::reducedMembers, SPQRColReducedMember::rigidPathEnd, SPQRColReducedMember::rigidPathStart, SCIP_Bool, and SPQRColReducedMember::type.

Referenced by checkLeaf().

◆ checkLeaf()

static ReducedMemberType checkLeaf ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  leaf,
spqr_arc  toParent,
reduced_member_id  parent,
spqr_arc  toChild 
)
static

Check if a leaf node closes a cycle with its child.

If so, we can propagate this cycle to a virtual arc of the child node member and shrink the decomposition.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
leafThe leaf node of the reduced SPQR tree
toParentThe virtual arc to the leaf node's neighbour
parentThe neighbouring member of the leaf node.
toChildThe virtual arc from the neighbouring member pointing to the leaf.

Definition at line 5177 of file network.c.

References PathArcListNode::arc, arcIsReversedNonRigid(), arcIsTree(), checkRigidLeaf(), createPathArc(), FALSE, findMember(), SPQRColReducedMember::firstPathArc, getMemberType(), getNumMemberArcs(), SPQRColReducedMember::member, PathArcListNode::nextMember, pathArcIsValid(), SCIP_NETCOLADD::pathArcs, SPQRColReducedMember::pathBackwards, REDUCEDMEMBER_TYPE_CYCLE, REDUCEDMEMBER_TYPE_MERGED, REDUCEDMEMBER_TYPE_NOT_NETWORK, reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, SCIP_NETCOLADD::remainsNetwork, PathArcListNode::reversed, SCIP_Bool, SCIPABORT, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, SPQR_MEMBERTYPE_UNASSIGNED, SPQRarcIsValid(), TRUE, and SPQRColReducedMember::type.

Referenced by propagateCycles().

◆ propagateCycles()

◆ determineComponentTypes()

static void determineComponentTypes ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
SPQRColReducedComponent component 
)
static

Determine the type of a single component.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
componentThe component to determine the types for

Definition at line 5412 of file network.c.

References determinePathTypes(), determineSingleComponentType(), SPQRColReducedComponent::numPathEndMembers, SPQRColReducedComponent::pathEndMembers, and SPQRColReducedComponent::root.

Referenced by netcoladdCheck().

◆ netcoladdCheck()

static SCIP_RETCODE netcoladdCheck ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD coladd,
int  column,
const int *  nonzrows,
const double *  nonzvals,
int  nnonzs 
)
static

Checks if the given column can be added to the network matrix decomposition.

See header for more info.

Parameters
decThe network matrix decomposition
coladdThe network matrix column addition data structure
columnThe column to add
nonzrowsThe column's nonzero row indices
nonzvalsThe column's nonzero entries
nnonzsThe number of nonzeros in the column

Definition at line 5439 of file network.c.

References cleanUpMemberInformation(), cleanupPreviousIteration(), computeLeafMembers(), constructReducedDecomposition(), createPathArcs(), determineComponentTypes(), netMatDecDataContainsColumn(), newColUpdateColInformation(), SCIP_NETCOLADD::numReducedComponents, propagateCycles(), SCIP_NETCOLADD::reducedComponents, SCIP_NETCOLADD::remainsNetwork, SCIP_CALL, SCIP_INVALIDDATA, SCIP_OKAY, and TRUE.

Referenced by SCIPnetmatdecTryAddCol().

◆ setTerminalHead()

static void setTerminalHead ( NewColInformation info,
spqr_node  node 
)
static

Set the head node of the new column edge to be added.

Parameters
infoThe new column information
nodeThe head node of the new column edge

Definition at line 5502 of file network.c.

References NewColInformation::head, SPQRnodeIsInvalid(), and SPQRnodeIsValid().

Referenced by columnTransformSingleRigid(), transformAndMergeRigid(), transformAndMergeSeries(), and transformFirstPathMember().

◆ setTerminalTail()

static void setTerminalTail ( NewColInformation info,
spqr_node  node 
)
static

Set the tail node of the new column edge to be added.

Parameters
infoThe new column information
nodeThe tail node of the new column edge

Definition at line 5516 of file network.c.

References SPQRnodeIsInvalid(), SPQRnodeIsValid(), and NewColInformation::tail.

Referenced by columnTransformSingleRigid(), transformAndMergeRigid(), transformAndMergeSeries(), and transformFirstPathMember().

◆ setTerminalReversed()

static void setTerminalReversed ( NewColInformation info,
SCIP_Bool  reversed 
)
static

Set whether the new column arc should be reversed.

Parameters
infoThe new column information
reversedShould the new column arc be reversed?

Definition at line 5530 of file network.c.

References NewColInformation::reversed.

Referenced by columnTransformSingleParallel(), columnTransformSingleRigid(), splitSeries(), transformAndMergeRigid(), and transformAndMergeSeries().

◆ setTerminalMember()

static void setTerminalMember ( NewColInformation info,
spqr_member  member 
)
static

Set the member that contains the new column arc.

Parameters
infoThe new column information
memberThe decomposition member that contains the new column arc

Definition at line 5542 of file network.c.

References NewColInformation::member.

Referenced by columnTransformSingleParallel(), columnTransformSingleRigid(), splitSeries(), transformAndMergeRigid(), and transformAndMergeSeries().

◆ setTerminalRepresentative()

static void setTerminalRepresentative ( NewColInformation info,
spqr_arc  representative 
)
static

Set the representative arc of the new column arc.

Parameters
infoThe new column information
representativeThe representative arc of the new column arc

Definition at line 5554 of file network.c.

References NewColInformation::representative.

Referenced by columnTransformSingleRigid(), transformAndMergeRigid(), and transformAndMergeSeries().

◆ splitParallel()

static SCIP_RETCODE splitParallel ( SCIP_NETMATDECDATA dec,
spqr_member  parallel,
spqr_arc  arc1,
spqr_arc  arc2,
spqr_member childParallel 
)
static

Splits a parallel member into two adjacent parallel members connected by a virtual edge pair.

One member keeps the two arcs passed to this function, the other member gets all other arcs.

Parameters
decThe network matrix decomposition
parallelThe parallel member
arc1First arc to keep.
arc2Second arc to keep.
childParallelOut pointer to the new child parallel member.

Definition at line 5569 of file network.c.

References arcIsTree(), createMarkerPair(), createMember(), FALSE, markerToParent(), moveArcToNewMember(), SCIP_Bool, SCIP_CALL, SCIP_OKAY, SPQR_MEMBERTYPE_PARALLEL, SPQRarcIsValid(), and SPQRmemberIsValid().

Referenced by transformAndMergeParallel().

◆ splitSeries()

static SCIP_RETCODE splitSeries ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
SPQRColReducedMember reducedMember,
spqr_member  member,
spqr_member loopMember,
NewColInformation newColInfo 
)
static

Very elaborate function that splits a series member into multiple members based on the structure of the path arcs.

The updated member reflects the structure of the updated SPQR tree after the new column arc is added.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberThe reduced member of the series member to split.
memberThe series member to split.
loopMemberOut-pointer to a new loop member that may be created
newColInfoNew column information struct

Definition at line 5607 of file network.c.

References PathArcListNode::arc, arcFlipReversed(), SCIP_NETCOLADD::arcInPath, arcIsChildMarker(), arcIsReversedNonRigid(), changeLoopToParallel(), createMarkerPair(), createMember(), FALSE, findArcChildMember(), findMemberParent(), SPQRColReducedMember::firstPathArc, getFirstMemberArc(), getMemberType(), getNextMemberArc(), getNumMemberArcs(), markerOfParent(), markerToParent(), SPQRColReducedMember::member, memberIsRepresentative(), moveArcToNewMember(), PathArcListNode::nextMember, SPQRColReducedMember::numPathArcs, pathArcIsValid(), SCIP_NETCOLADD::pathArcs, SPQRColReducedMember::pathBackwards, SCIP_Bool, SCIP_CALL, SCIP_OKAY, setTerminalMember(), setTerminalReversed(), SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_SERIES, SPQRmemberIsValid(), and TRUE.

Referenced by columnTransformSingleSeries().

◆ splitSeriesMerging()

static SCIP_RETCODE splitSeriesMerging ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
SPQRColReducedMember reducedMember,
spqr_member  member,
spqr_arc pathRepresentative,
spqr_arc nonPathRepresentative,
spqr_arc  exceptionArc1,
spqr_arc  exceptionArc2 
)
static

Very elaborate function that splits a series member into multiple members based on the structure of the path arcs.

The updated member reflects the structure of the updated SPQR tree after the new column arc is added. This variant is only used on series members that are part of a reduced tree that is not a single member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberThe reduced member of the series member to split.
memberThe series member to split.
pathRepresentativeOut pointer pointing to the tree arc in the final series node
nonPathRepresentativeOut pointer pointing to the non-tree arc in the final series node
exceptionArc1The first exception arc. Set to SPQR_INVALID_ARC to ignore
exceptionArc2The second exception arc. Set to SPQR_INVALID_ARC to ignore

Definition at line 5789 of file network.c.

References PathArcListNode::arc, SCIP_NETCOLADD::arcInPath, arcIsTree(), createMarkerPairWithReferences(), createMember(), FALSE, SPQRColReducedMember::firstPathArc, getFirstMemberArc(), getNextMemberArc(), getNumMemberArcs(), markerToParent(), memberIsRepresentative(), moveArcToNewMember(), PathArcListNode::nextMember, SPQRColReducedMember::numPathArcs, pathArcIsValid(), SCIP_NETCOLADD::pathArcs, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SPQR_INVALID_ARC, SPQR_MEMBERTYPE_SERIES, SPQRarcIsValid(), SPQRmemberIsValid(), and TRUE.

Referenced by transformAndMergeSeries(), and transformFirstPathMember().

◆ transformFirstPathMember()

static SCIP_RETCODE transformFirstPathMember ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  reducedMember,
NewColInformation newColInfo,
spqr_arc representativeArc,
spqr_member mergedMember 
)
static

Transforms the first member in the path of members to reflect the new column update.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberThe reduced member to transform
newColInfoThe new column information
representativeArcPointer to the representative of the member, needed for merging.
mergedMemberPointer to the merged member

Definition at line 5929 of file network.c.

References a, arcIsReversedNonRigid(), arcSetRepresentative(), arcSetReversed(), b, createNode(), FALSE, findArcSign(), getMemberType(), getNumMemberArcs(), INTO_HEAD, INTO_TAIL, SPQRColReducedMember::member, OUT_HEAD, OUT_TAIL, SPQRColReducedMember::pathTargetArc, SPQRColReducedMember::pathType, SCIP_NETCOLADD::reducedMembers, ArcSign::representative, SPQRColReducedMember::rigidPathEnd, SPQRColReducedMember::rigidPathStart, SCIP_Bool, SCIP_CALL, SCIP_OKAY, setArcHeadAndTail(), setTerminalHead(), setTerminalTail(), splitSeriesMerging(), SPQR_INVALID_ARC, SPQR_INVALID_NODE, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, and SPQRarcIsValid().

Referenced by transformPath().

◆ transformAndMergeParallel()

static SCIP_RETCODE transformAndMergeParallel ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  current,
reduced_member_id  next,
spqr_member  nextMember,
SCIP_Bool  nextIsParent,
spqr_arc representativeArc,
spqr_member mergedMember 
)
static

Transforms the next parallel member in the path of members and merge it into the current member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
currentThe current reduced member id
nextThe next reduced member
nextMemberThe member of the next reduced member in the path
nextIsParentIs the next reduced member the parent of the current member?
representativeArcPointer to the representative of the member, needed for merging.
mergedMemberPointer to the merged member

Definition at line 6034 of file network.c.

References arcIsReversedNonRigid(), arcSetRepresentative(), arcSetReversed(), createNode(), FALSE, getFirstMemberArc(), getNextMemberArc(), getNumMemberArcs(), INVALID_REDUCED_MEMBER, SPQRColReducedMember::member, mergeArcSigns(), mergeGivenMemberIntoParent(), SPQRColReducedMember::pathSourceArc, SPQRColReducedMember::pathTargetArc, SCIP_NETCOLADD::reducedMembers, SCIP_Bool, SCIP_CALL, SCIP_OKAY, setArcHeadAndTail(), splitParallel(), SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, and TRUE.

Referenced by transformAndMerge().

◆ transformAndMergeSeries()

static SCIP_RETCODE transformAndMergeSeries ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  current,
reduced_member_id  next,
spqr_member  nextMember,
SCIP_Bool  nextIsParent,
spqr_arc representativeArc,
spqr_member mergedMember,
NewColInformation info 
)
static

Transforms the next series member in the path of members and merge it into the current member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
currentThe current reduced member id
nextThe next reduced member
nextMemberThe member of the next reduced member in the path
nextIsParentIs the next reduced member the parent of the current member?
representativeArcPointer to the representative of the member, needed for merging.
mergedMemberPointer to the merged member
infoThe new column information

Definition at line 6111 of file network.c.

References a, arcIsReversedNonRigid(), arcSetRepresentative(), arcSetReversed(), b, createNode(), FALSE, getNumMemberArcs(), isHead(), isInto(), mergeArcSigns(), mergeGivenMemberIntoParent(), SPQRColReducedMember::pathSourceArc, SPQRColReducedMember::pathTargetArc, SPQRColReducedMember::pathType, SCIP_NETCOLADD::reducedMembers, SCIP_Bool, SCIP_CALL, SCIP_OKAY, setArcHeadAndTail(), setTerminalHead(), setTerminalMember(), setTerminalRepresentative(), setTerminalReversed(), setTerminalTail(), splitSeriesMerging(), SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, SPQRarcIsInvalid(), SPQRarcIsValid(), and TRUE.

Referenced by transformAndMerge().

◆ transformAndMergeRigid()

static SCIP_RETCODE transformAndMergeRigid ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  current,
reduced_member_id  next,
spqr_member  nextMember,
SCIP_Bool  nextIsParent,
spqr_arc representativeArc,
spqr_member mergedMember,
NewColInformation info 
)
static

Transforms the next rigid member in the path of members and merge it into the current member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
currentThe current reduced member id
nextThe next reduced member
nextMemberThe member of the next reduced member in the path
nextIsParentIs the next reduced member the parent of the current member?
representativeArcPointer to the representative of the member, needed for merging.
mergedMemberPointer to the merged member
infoThe new column information

Definition at line 6264 of file network.c.

References FALSE, findArcSign(), isInto(), mergeArcSigns(), mergeGivenMemberIntoParent(), SPQRColReducedMember::pathSourceArc, SPQRColReducedMember::pathTargetArc, SPQRColReducedMember::pathType, SCIP_NETCOLADD::reducedMembers, ArcSign::representative, SPQRColReducedMember::reverseArcs, SPQRColReducedMember::rigidPathEnd, SPQRColReducedMember::rigidPathStart, SCIP_CALL, SCIP_OKAY, setTerminalHead(), setTerminalMember(), setTerminalRepresentative(), setTerminalReversed(), setTerminalTail(), SPQR_INVALID_MEMBER, and SPQRarcIsInvalid().

Referenced by transformAndMerge().

◆ transformAndMerge()

static SCIP_RETCODE transformAndMerge ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  current,
reduced_member_id  next,
spqr_arc representativeArc,
spqr_member mergedMember,
SCIP_Bool  nextIsParent,
NewColInformation info 
)
static

Transforms the next member in the path of members and merge it into the current member.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
currentThe current reduced member id
nextThe next reduced member
representativeArcPointer to the representative of the member, needed for merging.
mergedMemberPointer to the merged member
nextIsParentIs the next reduced member the parent of the current member?
infoThe new column information

Definition at line 6334 of file network.c.

References getMemberType(), SPQRColReducedMember::member, SCIP_NETCOLADD::reducedMembers, SCIP_CALL, SCIP_ERROR, SCIP_OKAY, SCIPABORT, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, SPQR_MEMBERTYPE_UNASSIGNED, transformAndMergeParallel(), transformAndMergeRigid(), and transformAndMergeSeries().

Referenced by transformPath().

◆ transformPath()

static SCIP_RETCODE transformPath ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
SPQRColReducedComponent component,
NewColInformation newColInfo 
)
static

Transforms a single component when it contains multiple reduced members.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
componentThe component to transform
newColInfoThe new column information

Definition at line 6378 of file network.c.

References SPQRColReducedMember::nextPathMember, SPQRColReducedMember::nextPathMemberIsParent, SPQRColReducedComponent::pathEndMembers, reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, transformAndMerge(), and transformFirstPathMember().

Referenced by transformComponent().

◆ columnTransformSingleParallel()

static SCIP_RETCODE columnTransformSingleParallel ( SCIP_NETCOLADD newCol,
reduced_member_id  reducedMemberId,
spqr_member  member,
NewColInformation newColInfo 
)
static

Transform a single parallel member to add the new column.

Parameters
newColThe network matrix column addition data structure
reducedMemberIdThe reduced member to transform
memberThe member to transform
newColInfoThe new column information

Definition at line 6409 of file network.c.

References SPQRColReducedMember::firstPathArc, SPQRColReducedMember::numPathArcs, pathArcIsValid(), SPQRColReducedMember::pathBackwards, SCIP_NETCOLADD::reducedMembers, SCIP_OKAY, setTerminalMember(), and setTerminalReversed().

Referenced by transformComponent().

◆ columnTransformSingleSeries()

static SCIP_RETCODE columnTransformSingleSeries ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  reducedMemberId,
spqr_member  member,
NewColInformation newColInfo 
)
static

Transform a single series member to add the new column.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberIdThe reduced member to transform
memberThe member to transform
newColInfoThe new column information

Definition at line 6427 of file network.c.

References SCIP_NETCOLADD::arcInPathReversed, getFirstMemberArc(), getNumMemberArcs(), NewColInformation::member, SCIP_NETCOLADD::reducedMembers, NewColInformation::reversed, SCIP_CALL, SCIP_OKAY, and splitSeries().

Referenced by transformComponent().

◆ columnTransformSingleRigid()

static SCIP_RETCODE columnTransformSingleRigid ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
reduced_member_id  reducedMemberId,
spqr_member  member,
NewColInformation newColInfo 
)
static

Transform a single rigid member to add the new column.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
reducedMemberIdThe reduced member to transform
memberThe member to transform
newColInfoThe new column information

Definition at line 6451 of file network.c.

References PathArcListNode::arc, arcGetElement(), arcIsChildMarker(), arcIsReversedNonRigid(), arcIsTree(), SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::childMember, createChildMarker(), createColumnArc(), createMember(), createParentMarker(), createRowArc(), SPQRNetworkDecompositionArc::element, FALSE, findArcChildMember(), findArcHead(), findArcSign(), findArcTail(), findMemberParent(), SPQRColReducedMember::firstPathArc, getFirstNodeArc(), getMemberType(), getNextNodeArc(), MARKER_COLUMN_ELEMENT, MARKER_ROW_ELEMENT, SPQRNetworkDecompositionMember::markerOfParent, markerOfParent(), SPQRNetworkDecompositionMember::markerToParent, markerToParent(), SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::parentMember, SCIP_NETCOLADD::pathArcs, reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, ArcSign::representative, ArcSign::reversed, SPQRColReducedMember::rigidPathEnd, SPQRColReducedMember::rigidPathStart, SCIP_Bool, SCIP_CALL, SCIP_OKAY, setTerminalHead(), setTerminalMember(), setTerminalRepresentative(), setTerminalReversed(), setTerminalTail(), SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_MEMBERTYPE_PARALLEL, SPQRarcIsValid(), SPQRelementIsColumn(), SPQRelementToColumn(), SPQRelementToRow(), SPQRmemberIsValid(), SPQRnodeIsValid(), and TRUE.

Referenced by transformComponent().

◆ transformComponent()

static SCIP_RETCODE transformComponent ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol,
SPQRColReducedComponent component,
NewColInformation newColInfo 
)
static

Transform a component to reflect the new column.

Parameters
decThe network matrix decomposition
newColThe network matrix column addition data structure
componentThe component to transform
newColInfoThe new column information

Definition at line 6591 of file network.c.

References columnTransformSingleParallel(), columnTransformSingleRigid(), columnTransformSingleSeries(), getMemberType(), SPQRColReducedMember::member, SPQRColReducedMember::numChildren, SPQRColReducedMember::numPropagatedChildren, reducedMemberIsValid(), SCIP_NETCOLADD::reducedMembers, SPQRColReducedComponent::root, SCIP_CALL, SCIP_ERROR, SCIP_OKAY, SCIPABORT, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, SPQR_MEMBERTYPE_UNASSIGNED, and transformPath().

Referenced by netcoladdAdd().

◆ netcoladdRemainsNetwork()

static SCIP_Bool netcoladdRemainsNetwork ( const SCIP_NETCOLADD newCol)
static

Check if the submatrix stored remains a network matrix with the new column update.

Parameters
newColThe network matrix column addition data structure

Definition at line 6647 of file network.c.

References SCIP_NETCOLADD::remainsNetwork.

Referenced by netcoladdAdd(), and SCIPnetmatdecTryAddCol().

◆ netcoladdAdd()

static SCIP_RETCODE netcoladdAdd ( SCIP_NETMATDECDATA dec,
SCIP_NETCOLADD newCol 
)
static

◆ cutArcIsInvalid()

static SCIP_Bool cutArcIsInvalid ( const cut_arc_id  arc)
static

Checks if the given cut arc is invalid (negative).

Parameters
arcThe cut arc to check

Definition at line 6776 of file network.c.

Referenced by cutArcIsValid().

◆ cutArcIsValid()

◆ newRowUpdateRowInformation()

static SCIP_RETCODE newRowUpdateRowInformation ( const SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const spqr_row  row,
const spqr_col columns,
const double *  columnValues,
const int  numColumns 
)
static

Saves the information of the current row and partitions it based on whether or not the given columns are already part of the decomposition.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition datastructure
rowThe row to check
columnsThe column indices of the nonzeros in the row
columnValuesThe matrix entries of the nonzeros in the row
numColumnsThe number of nonzeros in the row

Definition at line 7022 of file network.c.

References BMSreallocBlockMemoryArray, SCIP_NETROWADD::decompositionColumnArcReversed, SCIP_NETROWADD::decompositionColumnArcs, SCIP_NETMATDECDATA::env, getDecompositionColumnArc(), SCIP_NETROWADD::memColumnArcs, SCIP_NETROWADD::memDecompositionColumnArcs, SCIP_NETROWADD::newColumnArcs, SCIP_NETROWADD::newColumnReversed, SCIP_NETROWADD::newRowIndex, SCIP_NETROWADD::numColumnArcs, SCIP_NETROWADD::numDecompositionColumnArcs, SCIP_ALLOC, SCIP_Bool, SCIP_OKAY, and SPQRarcIsValid().

Referenced by netrowaddCheck().

◆ createRowReducedMembersToRoot()

static reduced_member_id createRowReducedMembersToRoot ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const spqr_member  firstMember 
)
static

Adds members to the reduced member tree, by starting at the given member, jumping up to the parent, repeating this procedure until the root has been added.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition datastructure
firstMemberThe member to create a reduced member for

Definition at line 7080 of file network.c.

References SPQRRowReducedMember::allHaveCommonNode, SPQRRowReducedMember::articulationArc, SPQRRowReducedMember::coloredNode, SCIP_NETROWADD::createReducedMembersCallstack, SPQRRowReducedMember::depth, FALSE, findMemberParent(), SPQRRowReducedMember::firstCutArc, INVALID_CUT_ARC, INVALID_REDUCED_MEMBER, CreateReducedMembersCallstack::member, SPQRRowReducedMember::member, SCIP_NETROWADD::memberInformation, memberIsRepresentative(), SCIP_NETROWADD::memReducedComponents, SPQRRowReducedMember::numChildren, SPQRRowReducedMember::numCutArcs, SPQRRowReducedMember::numPropagatedChildren, SCIP_NETROWADD::numReducedComponents, SCIP_NETROWADD::numReducedMembers, SPQRRowReducedMember::otherNode, SPQRRowReducedMember::otherNodeSplit, SPQRRowReducedMember::parent, SCIP_NETROWADD::reducedComponents, MemberInfo::reducedMember, reducedMemberIsInvalid(), reducedMemberIsValid(), SCIP_NETROWADD::reducedMembers, SPQRRowReducedComponent::root, MemberInfo::rootDepthMinimizer, SPQRRowReducedMember::rootMember, SCIP_Bool, SPQRRowReducedMember::splitArc, SPQRRowReducedMember::splitHead, SPQRRowReducedMember::splitNode, SPQR_INVALID_ARC, SPQR_INVALID_NODE, SPQRmemberIsValid(), TRUE, SPQRRowReducedMember::type, TYPE_UNDETERMINED, and SPQRRowReducedMember::willBeReversed.

Referenced by constructRowReducedDecomposition().

◆ constructRowReducedDecomposition()

static SCIP_RETCODE constructRowReducedDecomposition ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow 
)
static

Construct the reduced decomposition, which is the smallest subtree containing all members cut arcs.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition datastructure

Definition at line 7187 of file network.c.

References BMSreallocBlockMemoryArray, SCIP_NETROWADD::childrenStorage, SCIP_NETROWADD::createReducedMembersCallstack, createRowReducedMembersToRoot(), SCIP_NETROWADD::decompositionColumnArcs, SPQRRowReducedMember::depth, SCIP_NETMATDECDATA::env, findArcMember(), findMemberParent(), SPQRRowReducedMember::firstChild, getNumMembers(), INVALID_REDUCED_MEMBER, largestMemberID(), MAX, SPQRRowReducedMember::member, SCIP_NETROWADD::memberInformation, memberIsRepresentative(), SCIP_NETROWADD::memChildrenStorage, SCIP_NETROWADD::memCreateReducedMembersCallstack, SCIP_NETROWADD::memMemberInformation, SCIP_NETROWADD::memReducedComponents, SCIP_NETROWADD::memReducedMembers, SPQRRowReducedMember::numChildren, SCIP_NETROWADD::numChildrenStorage, numConnectedComponents(), SCIP_NETROWADD::numDecompositionColumnArcs, SCIP_NETROWADD::numReducedComponents, SCIP_NETROWADD::numReducedMembers, SPQRRowReducedMember::parent, SCIP_NETROWADD::reducedComponents, MemberInfo::reducedMember, reducedMemberIsInvalid(), reducedMemberIsValid(), SCIP_NETROWADD::reducedMembers, SPQRRowReducedComponent::root, SPQRRowReducedComponent::rootDepth, MemberInfo::rootDepthMinimizer, SPQRRowReducedMember::rootMember, SCIP_ALLOC, SCIP_OKAY, and SPQRmemberIsValid().

Referenced by netrowaddCheck().

◆ createCutArc()

static void createCutArc ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const spqr_arc  arc,
const reduced_member_id  reducedMember,
SCIP_Bool  reversed 
)
static

◆ createReducedDecompositionCutArcs()

static SCIP_RETCODE createReducedDecompositionCutArcs ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow 
)
static

◆ determineLeafReducedMembers()

static SCIP_RETCODE determineLeafReducedMembers ( const SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow 
)
static

Determines the members of the reduced decomposition which are leafs.

This is used in propagation to ensure propagation is only checked for components which have at most one neighbour that is not propagated.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition datastructure

Definition at line 7442 of file network.c.

References BMSreallocBlockMemoryArray, SCIP_NETMATDECDATA::env, SCIP_NETROWADD::leafMembers, MAX, SCIP_NETROWADD::memLeafMembers, SPQRRowReducedMember::numChildren, SCIP_NETROWADD::numDecompositionColumnArcs, SCIP_NETROWADD::numLeafMembers, SCIP_NETROWADD::numReducedMembers, SCIP_NETROWADD::reducedMembers, SCIP_ALLOC, and SCIP_OKAY.

Referenced by netrowaddCheck().

◆ allocateRigidSearchMemory()

◆ zeroOutColors()

static void zeroOutColors ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const spqr_node  firstRemoveNode 
)
static

Clears the colors for all nodes.

We do DFS in reverse (reverse exploration order), as zeroing out the entire array is more expensive.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition datastructure
firstRemoveNodeThe first node that was colored in the original DFS

Definition at line 7578 of file network.c.

References ColorDFSCallData::arc, SCIP_NETROWADD::colorDFSData, findArcHead(), findArcTail(), getFirstNodeArc(), getNextNodeArc(), ColorDFSCallData::node, SCIP_NETROWADD::nodeColors, NULL, SPQRarcIsInvalid(), and UNCOLORED.

Referenced by cleanUpPreviousIteration(), rigidConnectedColoring(), and zeroOutColorsExceptNeighbourhood().

◆ cleanUpPreviousIteration()

static void cleanUpPreviousIteration ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow 
)
static

Cleans up various arrays used in previous iterations.

This is cheaper than reallocating empty memory.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition datastructure

Definition at line 7634 of file network.c.

References CutArcListNode::arc, SPQRRowReducedMember::coloredNode, cutArcIsValid(), SCIP_NETROWADD::cutArcs, FALSE, SCIP_NETROWADD::firstOverallCutArc, SCIP_NETROWADD::isArcCut, SCIP_NETROWADD::isArcCutReversed, SCIP_NETROWADD::memIsArcCut, SCIP_NETROWADD::memNodeColors, CutArcListNode::nextOverall, SCIP_NETROWADD::nodeColors, SCIP_NETROWADD::numReducedMembers, SCIP_NETROWADD::reducedMembers, SPQRnodeIsValid(), UNCOLORED, and zeroOutColors().

Referenced by netrowaddCheck().

◆ rigidFindStarNodes()

◆ zeroOutColorsExceptNeighbourhood()

static void zeroOutColorsExceptNeighbourhood ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const spqr_node  articulationNode,
const spqr_node  startRemoveNode 
)
static

Clears the colors for all nodes, but the neighbours.

We do DFS in reverse (reverse exploration order), as zeroing out the entire array is more expensive.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
articulationNodeThe node whose neighbours we want to keep
startRemoveNodeThe node where DFS started

Definition at line 7780 of file network.c.

References findArcHead(), findArcTail(), getFirstNodeArc(), getNextNodeArc(), SCIP_NETROWADD::memTemporaryColorArray, SCIP_NETROWADD::nodeColors, nodeDegree(), SCIP_NETROWADD::temporaryColorArray, and zeroOutColors().

Referenced by rigidConnectedColoring().

◆ intersectionOfAllPaths()

static void intersectionOfAllPaths ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  toCheck,
int *const  nodeNumPaths 
)
static

Find the intersection of all cut arc paths in the given rigid member.

Theoretically, there is a faster algorithm using lowest common ancestor queries, but it is quite complicated. Thus, we stick with the 'simple' version below, which is typically also faster in practice.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
toCheckThe rigid member to check
nodeNumPathsTracks for each node, how many cut arc paths cross it

Definition at line 7831 of file network.c.

References CutArcListNode::arc, arcIsTree(), cutArcIsValid(), SCIP_NETROWADD::cutArcs, findArcHead(), findArcHeadNoCompression(), findArcTail(), findArcTailNoCompression(), SPQRRowReducedMember::firstCutArc, getFirstNodeArc(), getNextNodeArc(), SCIP_NETROWADD::intersectionDFSData, SCIP_NETROWADD::intersectionPathDepth, SCIP_NETROWADD::intersectionPathParent, CutArcListNode::nextMember, DFSCallData::node, DFSCallData::nodeArc, SCIP_NETROWADD::reducedMembers, SPQR_INVALID_NODE, and SPQRnodeIsValid().

Referenced by rigidGetSplittableArticulationPointsOnPath().

◆ addArticulationNode()

static void addArticulationNode ( SCIP_NETROWADD newRow,
spqr_node  articulationNode 
)
static

Add a node to array of articulation nodes.

Parameters
newRowThe network matrix row addition data structure
articulationNodeThe node to add

Definition at line 7949 of file network.c.

References SCIP_NETROWADD::articulationNodes, and SCIP_NETROWADD::numArticulationNodes.

Referenced by articulationPoints().

◆ articulationPoints()

static void articulationPoints ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
ArticulationNodeInformation nodeInfo,
reduced_member_id  reducedMember 
)
static

Find all the articulation points of the rigid member graph where the cut arcs are removed.

Articulation points are nodes whose removal disconnects the remaining graph.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
nodeInfoStores information about the found articulation nodes
reducedMemberThe reduced member to find the articulation nodes for

Definition at line 7969 of file network.c.

References addArticulationNode(), ArticulationPointCallStack::arc, SCIP_NETROWADD::artDFSData, ArticulationNodeInformation::discoveryTime, FALSE, findArcHead(), findArcTail(), getFirstMemberArc(), getFirstNodeArc(), getNextNodeArc(), ArticulationPointCallStack::isAP, SCIP_NETROWADD::isArcCut, ArticulationNodeInformation::low, SPQRRowReducedMember::member, MIN, ArticulationPointCallStack::node, ArticulationPointCallStack::parent, SCIP_NETROWADD::reducedMembers, SCIP_Bool, SPQR_INVALID_NODE, and TRUE.

Referenced by rigidGetSplittableArticulationPointsOnPath().

◆ rigidConnectedColoringRecursive()

static void rigidConnectedColoringRecursive ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
spqr_node  articulationNode,
spqr_node  firstProcessNode,
COLOR_STATUS  firstColor,
SCIP_Bool isGood 
)
static

For a given articulation node, partitions the rigid member's graph where it is removed into a SOURCE and SINK partition.

All cut arcs must point (after reversal) from the source partition to the sink partition. This is akin to finding a 2-coloring, and uses a DFS to do so. This function specifically executes the DFS/recursive part.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
articulationNodeThe articulation node to obtain the coloring for
firstProcessNodeThe first node to process for the DFS
firstColorThe partition that the first node lies in.
isGoodReturns whether the coloring was consistent

Definition at line 8062 of file network.c.

References ColorDFSCallData::arc, COLOR_SINK, COLOR_SOURCE, SCIP_NETROWADD::colorDFSData, FALSE, findArcHead(), findArcSign(), findArcTail(), getFirstNodeArc(), getNextNodeArc(), SCIP_NETROWADD::isArcCut, SCIP_NETROWADD::isArcCutReversed, ColorDFSCallData::node, SCIP_NETROWADD::nodeColors, ArcSign::reversed, SCIP_Bool, and UNCOLORED.

Referenced by rigidConnectedColoring().

◆ rigidConnectedColoring()

static void rigidConnectedColoring ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  reducedMember,
const spqr_node  node,
SCIP_Bool *const  isGood 
)
static

For a given articulation node, partitions the rigid member's graph where it is removed into a SOURCE and SINK partition.

All cut arcs must point (after reversal) from the source partition to the sink partition. This is akin to finding a 2-coloring, and uses a DFS to do so.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedMemberThe rigid member whose graph to color
nodeThe articulation node to obtain the coloring for
isGoodReturns whether the coloring was consistent

Definition at line 8144 of file network.c.

References CutArcListNode::arc, CutArcListNode::arcReversed, COLOR_SINK, COLOR_SOURCE, SPQRRowReducedMember::coloredNode, SCIP_NETROWADD::cutArcs, findArcHead(), findArcHeadNoCompression(), findArcSign(), findArcTail(), findArcTailNoCompression(), SPQRRowReducedMember::firstCutArc, getFirstMemberArc(), getNextMemberArc(), SPQRRowReducedMember::member, SCIP_NETROWADD::nodeColors, SPQRRowReducedMember::numCutArcs, SCIP_NETROWADD::reducedMembers, rigidConnectedColoringRecursive(), SPQR_INVALID_NODE, SPQRarcIsValid(), SPQRnodeIsValid(), TRUE, UNCOLORED, zeroOutColors(), and zeroOutColorsExceptNeighbourhood().

Referenced by rigidGetSplittableArticulationPointsOnPath().

◆ checkNeighbourColoringArticulationNode()

static spqr_node checkNeighbourColoringArticulationNode ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const spqr_node  articulationNode,
spqr_arc *const  adjacentSplittingArc 
)
static

Given a coloring for an articulation node, we can prove that a neighbouring node is splittable if and only if it is the unique node in the neighbourhood of the articulation node within the SOURCE or SINK partition. In this function, we check for a splittable articulation node if such an adjacent node exists, and return it if possible.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
articulationNodeThe articulation whose neighbours are to be checked
adjacentSplittingArcThe arc connecting the two splittable nodes.

Definition at line 8219 of file network.c.

References arcIsTree(), COLOR_SOURCE, findArcHead(), findArcTail(), getFirstNodeArc(), getNextNodeArc(), SCIP_NETROWADD::isArcCut, SCIP_NETROWADD::nodeColors, SPQR_INVALID_ARC, SPQR_INVALID_NODE, and UNCOLORED.

Referenced by rigidGetSplittableArticulationPointsOnPath().

◆ rigidGetSplittableArticulationPointsOnPath()

static void rigidGetSplittableArticulationPointsOnPath ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  toCheck,
spqr_node  firstNode,
spqr_node  secondNode 
)
static

Find all the splittable articulation points that lie on the intersection of all cut arc cycles.

firstNode and secondNode can be set to limit the nodes that this function checks to the given nodes.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
toCheckThe rigid member to check
firstNodeOptional: the first given node that should be checked
secondNodeOptional: the second given node that should be checked

Definition at line 8289 of file network.c.

References SPQRRowReducedMember::articulationArc, SCIP_NETROWADD::articulationNodes, SCIP_NETROWADD::articulationNodeSearchInfo, articulationPoints(), checkNeighbourColoringArticulationNode(), COLOR_SOURCE, SCIP_NETROWADD::crossingPathCount, ArticulationNodeInformation::discoveryTime, FALSE, findArcHead(), findArcTail(), getFirstNodeArc(), getNextNodeArc(), getNumNodes(), intersectionOfAllPaths(), ArticulationNodeInformation::low, SCIP_NETROWADD::nodeColors, nodeIsRepresentative(), SCIP_NETROWADD::numArticulationNodes, SPQRRowReducedMember::numCutArcs, SPQRRowReducedMember::otherIsSource, SPQRRowReducedMember::otherNode, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, rigidConnectedColoring(), SCIP_Bool, SPQRRowReducedMember::splitNode, SPQR_INVALID_ARC, SPQRnodeIsInvalid(), SPQRnodeIsValid(), TRUE, SPQRRowReducedMember::type, TYPE_NOT_NETWORK, and UNCOLORED.

Referenced by determineRigidType(), determineSingleRowRigidType(), determineSplitTypeFirstLeaf(), and determineSplitTypeRigid().

◆ determineParallelType()

static void determineParallelType ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  toCheckMember,
const spqr_arc  markerToOther,
const reduced_member_id  otherMember,
const spqr_arc  markerToCheck 
)
static

Checks if a leaf parallel member can be propagated away from the reduced decomposition.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
toCheckMemberThe parallel leaf member to check
markerToOtherMarker to the non-leaf member
otherMemberThe connected non-leaf member
markerToCheckMarker from the non-leaf to the leaf parallel member

Definition at line 8394 of file network.c.

References CutArcListNode::arc, arcIsReversedNonRigid(), arcIsTree(), CutArcListNode::arcReversed, createCutArc(), cutArcIsValid(), SCIP_NETROWADD::cutArcs, FALSE, SPQRRowReducedMember::firstCutArc, getNumMemberArcs(), SPQRRowReducedMember::member, CutArcListNode::nextMember, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, SCIP_Bool, TRUE, SPQRRowReducedMember::type, TYPE_MERGED, TYPE_NOT_NETWORK, and TYPE_PROPAGATED.

Referenced by determineType().

◆ determineSeriesType()

static void determineSeriesType ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  toCheckMember,
const spqr_arc  markerToOther,
const reduced_member_id  otherMember,
const spqr_arc  markerToCheck 
)
static

Checks if a leaf series member can be propagated away from the reduced decomposition.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
toCheckMemberThe series leaf member to check
markerToOtherMarker to the non-leaf member
otherMemberThe connected non-leaf member
markerToCheckMarker from the non-leaf to the leaf series member

Definition at line 8448 of file network.c.

References CutArcListNode::arc, arcIsReversedNonRigid(), arcIsTree(), CutArcListNode::arcReversed, createCutArc(), cutArcIsValid(), SCIP_NETROWADD::cutArcs, SPQRRowReducedMember::firstCutArc, SPQRRowReducedMember::numCutArcs, SCIP_NETROWADD::reducedMembers, SPQRRowReducedMember::type, and TYPE_PROPAGATED.

Referenced by determineType().

◆ determineRigidType()

static void determineRigidType ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  toCheckMember,
const spqr_arc  markerToOther,
const reduced_member_id  otherMember,
const spqr_arc  markerToCheck 
)
static

Checks if a leaf rigid member can be propagated away from the reduced decomposition.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
toCheckMemberThe rigid leaf member to check
markerToOtherMarker to the non-leaf member
otherMemberThe connected non-leaf member
markerToCheckMarker from the non-leaf to the rigid leaf member

Definition at line 8471 of file network.c.

References SPQRRowReducedMember::articulationArc, createCutArc(), FALSE, findArcHead(), findArcSign(), findArcTail(), SPQRRowReducedMember::numCutArcs, SPQRRowReducedMember::otherIsSource, SPQRRowReducedMember::otherNode, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, rigidFindStarNodes(), rigidGetSplittableArticulationPointsOnPath(), SCIP_Bool, SPQRRowReducedMember::splitNode, SPQRarcIsValid(), SPQRnodeIsInvalid(), SPQRRowReducedMember::type, TYPE_MERGED, TYPE_NOT_NETWORK, and TYPE_PROPAGATED.

Referenced by determineType().

◆ determineType()

static RowReducedMemberType determineType ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  toCheckMember,
const spqr_arc  markerToOther,
const reduced_member_id  otherMember,
const spqr_arc  markerToCheck 
)
static

Checks if a leaf member can be propagated away from the reduced decomposition.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
toCheckMemberThe leaf member to check
markerToOtherMarker to the non-leaf member
otherMemberThe connected non-leaf member
markerToCheckMarker from the non-leaf to the leaf member

Definition at line 8537 of file network.c.

References determineParallelType(), determineRigidType(), determineSeriesType(), getMemberType(), SPQRRowReducedMember::member, SCIP_NETROWADD::reducedMembers, SCIPABORT, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, SPQR_MEMBERTYPE_UNASSIGNED, SPQRRowReducedMember::type, TYPE_NOT_NETWORK, and TYPE_UNDETERMINED.

Referenced by propagateComponents().

◆ propagateComponents()

◆ rigidDetermineCandidateNodesFromAdjacentComponents()

static Nodes rigidDetermineCandidateNodesFromAdjacentComponents ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  toCheck 
)
static

Computes the intersection nodes of all markers that point to reduced tree members.

These are the only nodes that may become Y-splittable, after propagation.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
toCheckThe rigid member to check

Definition at line 8692 of file network.c.

References SCIP_NETROWADD::childrenStorage, findArcHead(), findArcTail(), Nodes::first, SPQRRowReducedMember::firstChild, markerOfParent(), markerToParent(), SPQRRowReducedMember::member, SPQRRowReducedMember::numChildren, SPQRRowReducedMember::parent, reducedMemberIsValid(), SCIP_NETROWADD::reducedMembers, Nodes::second, SPQR_INVALID_NODE, SPQRnodeIsInvalid(), SPQRRowReducedMember::type, and TYPE_PROPAGATED.

Referenced by determineSplitTypeRigid().

◆ allocateTreeSearchMemory()

static SCIP_RETCODE allocateTreeSearchMemory ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow 
)
static

Allocates memory for various procedures that need to do tree-search for rigid members (e.g. DFS or BFS).

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure

Definition at line 8762 of file network.c.

References BMSreallocBlockMemoryArray, SCIP_NETMATDECDATA::env, MAX, SCIP_NETROWADD::memMergeTreeCallData, SCIP_NETROWADD::mergeTreeCallData, SCIP_NETROWADD::numReducedMembers, SCIP_ALLOC, and SCIP_OKAY.

Referenced by netrowaddCheck().

◆ determineSingleRowRigidType()

static void determineSingleRowRigidType ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedMember 
)
static

Determine the type of a rigid member when it is the only member in the reduced decomposition.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedMemberThe rigid member to determine the type for

Definition at line 8780 of file network.c.

References FALSE, SPQRRowReducedMember::numCutArcs, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, rigidFindStarNodes(), rigidGetSplittableArticulationPointsOnPath(), SPQRRowReducedMember::splitNode, SPQR_INVALID_NODE, SPQRnodeIsInvalid(), SPQRnodeIsValid(), SPQRRowReducedMember::type, TYPE_MERGED, and TYPE_NOT_NETWORK.

Referenced by determineMergeableTypes().

◆ determineSingleParallelType()

static void determineSingleParallelType ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedMember 
)
static

Determine the type of a parallel member when it is the only member in the reduced decomposition.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedMemberThe parallel member to determine the type for

Definition at line 8813 of file network.c.

References CutArcListNode::arc, arcIsReversedNonRigid(), CutArcListNode::arcReversed, cutArcIsValid(), SCIP_NETROWADD::cutArcs, FALSE, SPQRRowReducedMember::firstCutArc, CutArcListNode::nextMember, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, SCIP_Bool, TRUE, SPQRRowReducedMember::type, TYPE_MERGED, and TYPE_NOT_NETWORK.

Referenced by determineMergeableTypes().

◆ determineSingleSeriesType()

static void determineSingleSeriesType ( SCIP_NETROWADD newRow,
reduced_member_id  reducedMember 
)
static

Determine the type of a series member when it is the only member in the reduced decomposition.

Parameters
newRowThe network matrix row addition data structure
reducedMemberThe series member to determine the type for

Definition at line 8854 of file network.c.

References cutArcIsValid(), SPQRRowReducedMember::firstCutArc, SPQRRowReducedMember::numCutArcs, SCIP_NETROWADD::reducedMembers, SPQRRowReducedMember::type, and TYPE_MERGED.

Referenced by determineMergeableTypes().

◆ determineAndColorSplitNode()

static spqr_node determineAndColorSplitNode ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  id,
spqr_node  candidateOne,
spqr_node  candidateTwo 
)
static

Sets the given split nodes; performs bookkeeping so that we have an easier time updating the graph in many edge cases.

Algorithmically speaking, does nothing important.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
idThe reduced member that we compute the split node for
candidateOneThe first candidate node
candidateTwoThe second candidate node

Definition at line 8870 of file network.c.

References SPQRRowReducedMember::allHaveCommonNode, SPQRRowReducedMember::articulationArc, COLOR_SINK, COLOR_SOURCE, SPQRRowReducedMember::coloredNode, findArcHead(), findArcTail(), getFirstNodeArc(), getNextNodeArc(), SCIP_NETROWADD::nodeColors, SPQRRowReducedMember::numCutArcs, SPQRRowReducedMember::otherIsSource, SPQRRowReducedMember::otherNode, SCIP_NETROWADD::reducedMembers, SPQRRowReducedMember::splitNode, SPQR_INVALID_NODE, SPQRarcIsValid(), SPQRnodeIsInvalid(), and UNCOLORED.

Referenced by determineSplitTypeFirstLeaf(), and determineSplitTypeRigid().

◆ determineSplitTypeFirstLeaf()

◆ getRelativeOrientationRigid()

static SplitOrientation getRelativeOrientationRigid ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedId,
spqr_arc  arcToNext 
)
static

Get the split orientation for a given rigid member and marked arc.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedIdThe member to determine the split orientation for
arcToNextThe marked arc to determine the orientation for

Definition at line 9082 of file network.c.

References COLOR_SINK, COLOR_SOURCE, findArcHead(), findArcMemberNoCompression(), findArcSign(), findArcTail(), findEffectiveArcHead(), findEffectiveArcTailNoCompression(), SplitOrientation::headSplit, SPQRRowReducedMember::member, SCIP_NETROWADD::nodeColors, SPQRRowReducedMember::numCutArcs, SPQRRowReducedMember::otherIsSource, SplitOrientation::otherIsSource, SCIP_NETROWADD::reducedMembers, SPQRRowReducedMember::splitNode, SPQRnodeIsValid(), and SPQRRowReducedMember::willBeReversed.

Referenced by getRelativeOrientation().

◆ getRelativeOrientationParallel()

static SplitOrientation getRelativeOrientationParallel ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedId,
spqr_arc  arcToNext 
)
static

Get the split orientation for a given parallel member and marked arc.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedIdThe member to determine the split orientation for
arcToNextThe marked arc to determine the orientaiton for

Definition at line 9133 of file network.c.

References arcIsReversedNonRigid(), findArcMemberNoCompression(), SplitOrientation::headSplit, SPQRRowReducedMember::member, SPQRRowReducedMember::otherIsSource, SplitOrientation::otherIsSource, SCIP_NETROWADD::reducedMembers, SPQRRowReducedMember::splitArc, SPQRRowReducedMember::splitHead, and SPQRarcIsValid().

Referenced by getRelativeOrientation().

◆ getRelativeOrientationSeries()

static SplitOrientation getRelativeOrientationSeries ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedId,
spqr_arc  arcToNext 
)
static

Get the split orientation for a given series member and marked arc.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedIdThe member to determine the split orientation for
arcToNextThe marked arc to determine the orientaiton for

Definition at line 9158 of file network.c.

References arcIsReversedNonRigid(), findArcMemberNoCompression(), SplitOrientation::headSplit, SPQRRowReducedMember::member, SPQRRowReducedMember::otherIsSource, SplitOrientation::otherIsSource, SCIP_NETROWADD::reducedMembers, SPQRRowReducedMember::splitArc, SPQRRowReducedMember::splitHead, and SPQRarcIsValid().

Referenced by getRelativeOrientation().

◆ getRelativeOrientation()

static SplitOrientation getRelativeOrientation ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedId,
spqr_arc  arcToNext 
)
static

Get the split orientation for a given member and marked arc.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedIdThe member to determine the split orientation for
arcToNextThe marked arc to determine the orientaiton for

Definition at line 9183 of file network.c.

References FALSE, getMemberType(), getRelativeOrientationParallel(), getRelativeOrientationRigid(), getRelativeOrientationSeries(), SplitOrientation::headSplit, SPQRRowReducedMember::member, SplitOrientation::otherIsSource, SCIP_NETROWADD::reducedMembers, SCIPABORT, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, and SPQR_MEMBERTYPE_UNASSIGNED.

Referenced by determineSplitTypeNext().

◆ determineSplitTypeSeries()

static void determineSplitTypeSeries ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedId,
spqr_arc  marker,
SplitOrientation  previousOrientation 
)
static

Determine the split type of a series node when the SPQR tree is not a singular member.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedIdThe member to determine the split orientation for
markerThe marker to the previous member whose type was already determined
previousOrientationThe orientation to the previous member

Definition at line 9213 of file network.c.

References CutArcListNode::arc, arcIsReversedNonRigid(), CutArcListNode::arcReversed, cutArcIsValid(), SCIP_NETROWADD::cutArcs, FALSE, SPQRRowReducedMember::firstCutArc, SplitOrientation::headSplit, SPQRRowReducedMember::numChildren, SPQRRowReducedMember::numPropagatedChildren, SPQRRowReducedMember::otherIsSource, SplitOrientation::otherIsSource, SPQRRowReducedMember::parent, reducedMemberIsValid(), SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, SCIP_Bool, SPQRRowReducedMember::splitArc, SPQRRowReducedMember::splitHead, SPQRRowReducedMember::type, TYPE_MERGED, TYPE_NOT_NETWORK, and TYPE_PROPAGATED.

Referenced by determineSplitTypeNext().

◆ determineSplitTypeParallel()

static void determineSplitTypeParallel ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedId,
spqr_arc  marker,
SplitOrientation  previousOrientation 
)
static

Determine the split type of a parallel node when the SPQR tree is not a singular member.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedIdThe member to determine the split orientation for
markerThe marker to the previous member whose type was already determined
previousOrientationThe orientation to the previous member

Definition at line 9263 of file network.c.

References CutArcListNode::arc, arcIsReversedNonRigid(), CutArcListNode::arcReversed, cutArcIsValid(), SCIP_NETROWADD::cutArcs, FALSE, SPQRRowReducedMember::firstCutArc, SplitOrientation::headSplit, CutArcListNode::nextMember, SPQRRowReducedMember::otherIsSource, SplitOrientation::otherIsSource, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, SCIP_Bool, SPQRRowReducedMember::splitArc, SPQRRowReducedMember::splitHead, TRUE, SPQRRowReducedMember::type, TYPE_MERGED, and TYPE_NOT_NETWORK.

Referenced by determineSplitTypeNext().

◆ determineSplitTypeRigid()

static void determineSplitTypeRigid ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedId,
spqr_member  member,
spqr_arc  marker,
SplitOrientation  previousOrientation 
)
static

Determine the split type of a rigid node when the SPQR tree is not a singular member.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedIdThe reduced member to determine the split orientation for
memberThe member belonging to the reduced member
markerThe marker to the previous member whose type was already determined
previousOrientationThe orientation to the previous member

Definition at line 9322 of file network.c.

References COLOR_SINK, COLOR_SOURCE, determineAndColorSplitNode(), FALSE, findArcHead(), findArcSign(), findArcTail(), Nodes::first, getMemberType(), SplitOrientation::headSplit, SCIP_NETROWADD::nodeColors, SPQRRowReducedMember::numCutArcs, SPQRRowReducedMember::otherIsSource, SplitOrientation::otherIsSource, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, rigidDetermineCandidateNodesFromAdjacentComponents(), rigidFindStarNodes(), rigidGetSplittableArticulationPointsOnPath(), SCIP_Bool, Nodes::second, SPQRRowReducedMember::splitNode, SPQR_INVALID_NODE, SPQR_MEMBERTYPE_RIGID, SPQRnodeIsInvalid(), SPQRnodeIsValid(), SPQRRowReducedMember::type, TYPE_MERGED, TYPE_NOT_NETWORK, and SPQRRowReducedMember::willBeReversed.

Referenced by determineSplitTypeNext().

◆ determineSplitTypeNext()

static void determineSplitTypeNext ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  current,
reduced_member_id  next,
SCIP_Bool  currentIsParent 
)
static

Determine the split type of a node when the SPQR tree is not a singular member.

This function is used for all the nodes that are not first in the given ordering.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
currentThe current node, whose type has already been determined
nextThe next node to determine the type of, adjacent to the current node
currentIsParentIs the current node a parent of the next node?

Definition at line 9438 of file network.c.

References determineSplitTypeParallel(), determineSplitTypeRigid(), determineSplitTypeSeries(), FALSE, getMemberType(), getRelativeOrientation(), markerOfParent(), markerToParent(), SPQRRowReducedMember::member, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, SCIPABORT, SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, and SPQR_MEMBERTYPE_UNASSIGNED.

Referenced by determineMergeableTypes().

◆ determineMergeableTypes()

◆ cleanUpRowMemberInformation()

static void cleanUpRowMemberInformation ( SCIP_NETROWADD newRow)
static

Empty the new member information array.

Parameters
newRowThe network matrix row addition data structure

Definition at line 9591 of file network.c.

References INVALID_REDUCED_MEMBER, SPQRRowReducedMember::member, SCIP_NETROWADD::memberInformation, SCIP_NETROWADD::memMemberInformation, SCIP_NETROWADD::numReducedMembers, MemberInfo::reducedMember, reducedMemberIsInvalid(), and SCIP_NETROWADD::reducedMembers.

Referenced by netrowaddCheck().

◆ rigidTransformArcIntoCycle()

static SCIP_RETCODE rigidTransformArcIntoCycle ( SCIP_NETMATDECDATA dec,
const spqr_member  member,
const spqr_arc  arc,
const SCIP_Bool  reverseArcDirection,
NewRowInformation *const  newRowInfo 
)
static

Transforms a rigid arc by putting it in series with the new column arc.

We need to do some magic to keep our the internal datastructures consistent in this case.

Parameters
decThe network matrix decomposition
memberThe rigid member that contains the arc that is moved
arcThe arc that is moved to a new series member
reverseArcDirectionIs the given arc reversed?
newRowInfoStores information on how to add the new row

Definition at line 9614 of file network.c.

References arcGetElement(), arcIsChildMarker(), arcIsReversedNonRigid(), arcIsTree(), SCIP_NETMATDECDATA::arcs, SPQRNetworkDecompositionArc::childMember, createChildMarker(), createColumnArc(), createMember(), createParentMarker(), createRowArc(), SPQRNetworkDecompositionArc::element, FALSE, findArcChildMember(), findMemberParent(), getMemberType(), MARKER_COLUMN_ELEMENT, MARKER_ROW_ELEMENT, SPQRNetworkDecompositionMember::markerOfParent, markerOfParent(), SPQRNetworkDecompositionMember::markerToParent, markerToParent(), NewRowInformation::member, SCIP_NETMATDECDATA::members, SPQRNetworkDecompositionMember::parentMember, NewRowInformation::reversed, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_MEMBERTYPE_SERIES, SPQRelementIsColumn(), SPQRelementToColumn(), SPQRelementToRow(), and TRUE.

Referenced by transformSingleRigid().

◆ transformSingleRigid()

static SCIP_RETCODE transformSingleRigid ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  reducedMember,
const spqr_member  member,
NewRowInformation *const  newRowInfo 
)
static

◆ splitParallelRowAddition()

static SCIP_RETCODE splitParallelRowAddition ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  reducedMember,
const spqr_member  member,
NewRowInformation *const  newRowInfo 
)
static

Splits a single parallel member into two adjacent ones, where the cut arcs and non-cut arcs get their own member.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedMemberThe reduced member to transform
memberThe member belonging to the reduced member
newRowInfoStores information about the new row placement

Definition at line 9864 of file network.c.

References CutArcListNode::arc, arcIsChildMarker(), arcIsReversedNonRigid(), arcIsTree(), CutArcListNode::arcReversed, changeLoopToSeries(), createMarkerPair(), createMember(), cutArcIsValid(), SCIP_NETROWADD::cutArcs, FALSE, findArcChildMember(), findMemberParent(), SPQRRowReducedMember::firstCutArc, getFirstMemberArc(), getMemberType(), getNextMemberArc(), getNumMemberArcs(), markerOfParent(), markerToParent(), NewRowInformation::member, moveArcToNewMember(), CutArcListNode::nextMember, SPQRRowReducedMember::numCutArcs, SCIP_NETROWADD::reducedMembers, NewRowInformation::reversed, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_SERIES, SPQRmemberIsValid(), and TRUE.

Referenced by transformSingleParallel().

◆ transformSingleParallel()

static SCIP_RETCODE transformSingleParallel ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  reducedMember,
const spqr_member  member,
NewRowInformation info 
)
static

Updates a single rigid member to reflect the new row.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedMemberThe reduced member to transform
memberThe member belonging to the reduced member
infoStores information about the new row placement

Definition at line 10061 of file network.c.

References SCIP_CALL, SCIP_OKAY, and splitParallelRowAddition().

Referenced by transformComponentRowAddition().

◆ splitSeriesMergingRowAddition()

static SCIP_RETCODE splitSeriesMergingRowAddition ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
const reduced_member_id  reducedMember,
const spqr_member  member,
spqr_member *const  mergingMember,
SCIP_Bool *const  isCut,
spqr_arc representativeEdge 
)
static

Split a series member into multiple series members for merging.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedMemberThe reduced series member
memberThe member belonging to the reduced member
mergingMemberThe member that contains the arcs that are to be merged
isCutArray that contains whether each arc is Cut
representativeEdgePointer to the representative arc for the split off arcs

Definition at line 10075 of file network.c.

References arcIsTree(), SCIP_NETROWADD::childrenStorage, createMarkerPairWithReferences(), createMember(), FALSE, findMember(), SPQRRowReducedMember::firstChild, getFirstMemberArc(), getNextMemberArc(), getNumMemberArcs(), markerOfParent(), markerToParent(), SPQRRowReducedMember::member, moveArcToNewMember(), SPQRRowReducedMember::numChildren, SPQRRowReducedMember::numCutArcs, SPQRRowReducedMember::parent, reducedMemberIsInvalid(), reducedMemberIsValid(), SCIP_NETROWADD::reducedMembers, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SPQRRowReducedMember::splitArc, SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_MEMBERTYPE_SERIES, SPQRarcIsInvalid(), TRUE, SPQRRowReducedMember::type, TYPE_MERGED, and TYPE_PROPAGATED.

Referenced by splitAndMergeSeries().

◆ splitParallelMerging()

static SCIP_RETCODE splitParallelMerging ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  reducedMember,
spqr_member  member,
spqr_member *const  pMergeMember,
spqr_arc *const  cutRepresentative 
)
static

Split a parallel member into multiple parallel members for merging.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
reducedMemberThe reduced parallel member
memberThe member belonging to the reduced member
pMergeMemberThe member that contains the arcs that are to be merged
cutRepresentativePointer to the representative arc for all cut arcs

Definition at line 10195 of file network.c.

References CutArcListNode::arc, arcIsTree(), SCIP_NETROWADD::childrenStorage, createMarkerPairWithReferences(), createMember(), cutArcIsValid(), SCIP_NETROWADD::cutArcs, FALSE, findMember(), SPQRRowReducedMember::firstChild, SPQRRowReducedMember::firstCutArc, getNumMemberArcs(), markerOfParent(), markerToParent(), SPQRRowReducedMember::member, moveArcToNewMember(), CutArcListNode::nextMember, SPQRRowReducedMember::numChildren, SPQRRowReducedMember::numCutArcs, SPQRRowReducedMember::numPropagatedChildren, SPQRRowReducedMember::parent, reducedMemberIsValid(), SCIP_NETROWADD::reducedMembers, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_MEMBERTYPE_PARALLEL, SPQRarcIsValid(), TRUE, SPQRRowReducedMember::type, TYPE_MERGED, and TYPE_PROPAGATED.

Referenced by splitAndMergeParallel(), and splitFirstLeaf().

◆ splitFirstLeaf()

static SCIP_RETCODE splitFirstLeaf ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  leaf,
NewRowInformation *const  newRowInfo 
)
static

◆ mergeSplitMemberIntoParent()

static SCIP_RETCODE mergeSplitMemberIntoParent ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
spqr_member  member,
spqr_member  parent,
spqr_arc  parentToChild,
spqr_arc  childToParent,
SCIP_Bool  headToHead,
spqr_node  parentNode,
spqr_node  childNode,
spqr_member mergedMember,
spqr_node arcNodeOne,
spqr_node arcNodeTwo,
spqr_node thirdNode 
)
static

Merge an (updated) member into its parent.

This function is mainly there to prevent duplication.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
memberThe member to merge
parentThe member's parent
parentToChildThe marker pointing from the parent to child
childToParentThe marker pointing from the child to the parent
headToHeadShould the marker heads be identified with one another?
parentNodeA node in the parent that is not adjacent to the marker
childNodeA node in the child that is not adjacent to the marker
mergedMemberPointer to the member that contains both members after merging
arcNodeOneThe first identified node of the two marker arcs
arcNodeTwoThe second identified node of the two marker arcs
thirdNodeThe node that parentNode and childNode are identified into

Definition at line 10577 of file network.c.

References clearArcHeadAndTail(), findEffectiveArcHead(), findEffectiveArcTail(), findMemberParentNoCompression(), markerOfParent(), markerToParent(), memberIsRepresentative(), mergeMemberArcList(), mergeMembers(), mergeNodeArcList(), mergeNodes(), SCIP_NETROWADD::nodeColors, removeArcFromMemberArcList(), SCIP_OKAY, SPQR_MEMBERTYPE_RIGID, SPQRmemberIsValid(), UNCOLORED, updateMemberParentInformation(), and updateMemberType().

Referenced by splitAndMergeParallel(), splitAndMergeRigid(), and splitAndMergeSeries().

◆ splitAndMergeSeries()

static SCIP_RETCODE splitAndMergeSeries ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  smallMember,
SCIP_Bool  largeIsParent,
NewRowInformation *const  newRowInfo,
spqr_member  member 
)
static

Update a series member to reflect the addition of the new row, and merge it into the previous members that were updated.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
smallMemberThe reduced series member
largeIsParentWhether the large member containing previously updated members is the parent of this member
newRowInfoStores the information on how to add the new row
memberThe member belonging to the reduced series member

Definition at line 10656 of file network.c.

References a, arcIsReversedNonRigid(), arcSetRepresentative(), arcSetReversed(), b, createNode(), cutArcIsValid(), FALSE, findEffectiveArcHead(), findEffectiveArcTail(), SPQRRowReducedMember::firstCutArc, getFirstMemberArc(), getNextMemberArc(), getNumMemberArcs(), NewRowInformation::head, markerOfParent(), markerToParent(), SPQRRowReducedMember::member, NewRowInformation::member, mergeArcSigns(), mergeSplitMemberIntoParent(), nodeIsRepresentative(), SCIP_NETROWADD::reducedMembers, NewRowInformation::representative, SCIP_Bool, SCIP_CALL, SCIP_OKAY, setArcHeadAndTail(), SPQRRowReducedMember::splitArc, SPQRRowReducedMember::splitHead, splitSeriesMergingRowAddition(), SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, NewRowInformation::tail, and TRUE.

Referenced by splitAndMerge().

◆ splitAndMergeParallel()

static SCIP_RETCODE splitAndMergeParallel ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  smallMember,
SCIP_Bool  largeIsParent,
NewRowInformation *const  newRowInfo,
spqr_member  member 
)
static

Update a parallel member to reflect the addition of the new row, and merge it into the previous members that were updated.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
smallMemberThe reduced parallel member
largeIsParentWhether the large member containing previously updated members is the parent of this member
newRowInfoStores the information on how to add the new row
memberThe member belonging to the reduced parallel member

Definition at line 10799 of file network.c.

References arcIsReversedNonRigid(), arcSetRepresentative(), arcSetReversed(), createNode(), FALSE, findArcMemberNoCompression(), findEffectiveArcHead(), findEffectiveArcTail(), getFirstMemberArc(), getNextMemberArc(), NewRowInformation::head, markerOfParent(), markerToParent(), SPQRRowReducedMember::member, NewRowInformation::member, mergeArcSigns(), mergeSplitMemberIntoParent(), nodeIsRepresentative(), SCIP_NETROWADD::reducedMembers, NewRowInformation::representative, SCIP_Bool, SCIP_CALL, SCIP_OKAY, setArcHeadAndTail(), SPQRRowReducedMember::splitArc, SPQRRowReducedMember::splitHead, splitParallelMerging(), SPQR_INVALID_ARC, SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, NewRowInformation::tail, and TRUE.

Referenced by splitAndMerge().

◆ splitAndMergeRigid()

static SCIP_RETCODE splitAndMergeRigid ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  smallMember,
SCIP_Bool  largeIsParent,
NewRowInformation *const  newRowInfo,
spqr_member  member 
)
static

Update a rigid member to reflect the addition of the new row, and merge it into the previous members that were updated.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
smallMemberThe reduced rigid member
largeIsParentWhether the large member containing previously updated members is the parent of this member
newRowInfoStores the information on how to add the new row
memberThe member belonging to the reduced rigid member

Definition at line 10931 of file network.c.

References changeArcHead(), changeArcTail(), COLOR_SOURCE, createNode(), findArcHead(), findArcSign(), findArcTail(), getFirstNodeArc(), getNextNodeArc(), NewRowInformation::head, SCIP_NETROWADD::isArcCut, markerOfParent(), markerToParent(), NewRowInformation::member, mergeArcSigns(), mergeSplitMemberIntoParent(), SCIP_NETROWADD::nodeColors, SPQRRowReducedMember::numCutArcs, SCIP_NETROWADD::reducedMembers, ArcSign::representative, NewRowInformation::representative, SCIP_Bool, SCIP_CALL, SCIP_OKAY, SPQRRowReducedMember::splitNode, SPQR_INVALID_MEMBER, SPQR_INVALID_NODE, NewRowInformation::tail, TRUE, UNCOLORED, and SPQRRowReducedMember::willBeReversed.

Referenced by splitAndMerge().

◆ splitAndMerge()

static SCIP_RETCODE splitAndMerge ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  smallMember,
SCIP_Bool  largeIsParent,
NewRowInformation *const  newRowInfo 
)
static

Update a member to reflect the addition of the new row, and merge it into the previous members that were updated.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
smallMemberThe reduced rigid member
largeIsParentWhether the large member containing previously updated members is the parent of this member
newRowInfoStores the information on how to add the new row

Definition at line 11077 of file network.c.

References FALSE, getMemberType(), SPQRRowReducedMember::member, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, SCIP_CALL, SCIP_ERROR, SCIP_OKAY, SCIPABORT, splitAndMergeParallel(), splitAndMergeRigid(), splitAndMergeSeries(), SPQR_MEMBERTYPE_LOOP, SPQR_MEMBERTYPE_PARALLEL, SPQR_MEMBERTYPE_RIGID, SPQR_MEMBERTYPE_SERIES, and SPQR_MEMBERTYPE_UNASSIGNED.

Referenced by mergeTree().

◆ mergeTree()

static SCIP_RETCODE mergeTree ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
reduced_member_id  root,
NewRowInformation *const  newRowInfo 
)
static

Update an SPQR tree with multiple members to reflect the addition of a new row, merging it into one big rigid node.

Parameters
decThe network matrix decomposition
newRowThe network matrix row addition data structure
rootThe root node of the SPQR tree that is to be merged
newRowInfoStores the information on how to add the new row

Definition at line 11120 of file network.c.

References SCIP_NETROWADD::childrenStorage, MergeTreeCallData::currentChild, FALSE, SPQRRowReducedMember::firstChild, MergeTreeCallData::id, SCIP_NETROWADD::mergeTreeCallData, SPQRRowReducedMember::numChildren, SPQRRowReducedMember::numPropagatedChildren, SPQRRowReducedMember::parent, reducedMemberIsValid(), SCIP_NETROWADD::reducedMembers, SCIP_CALL, SCIP_OKAY, splitAndMerge(), splitFirstLeaf(), TRUE, SPQRRowReducedMember::type, and TYPE_PROPAGATED.

Referenced by transformComponentRowAddition().

◆ transformComponentRowAddition()

static SCIP_RETCODE transformComponentRowAddition ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD newRow,
SPQRRowReducedComponent component,
NewRowInformation *const  newRowInfo 
)
static

◆ netrowaddCreate()

static SCIP_RETCODE netrowaddCreate ( BMS_BLKMEM blkmem,
SCIP_NETROWADD **  prowadd 
)
static

Create the network row addition data structure.

Parameters
blkmemBlock memory
prowaddPointer to store the new row addition struct at

Definition at line 11256 of file network.c.

References SCIP_NETROWADD::artDFSData, SCIP_NETROWADD::articulationNodes, SCIP_NETROWADD::articulationNodeSearchInfo, BMSallocBlockMemory, SCIP_NETROWADD::childrenStorage, SCIP_NETROWADD::colorDFSData, SCIP_NETROWADD::createReducedMembersCallstack, SCIP_NETROWADD::crossingPathCount, SCIP_NETROWADD::cutArcs, SCIP_NETROWADD::decompositionColumnArcReversed, SCIP_NETROWADD::decompositionColumnArcs, SCIP_NETROWADD::firstOverallCutArc, SCIP_NETROWADD::intersectionDFSData, SCIP_NETROWADD::intersectionPathDepth, SCIP_NETROWADD::intersectionPathParent, INVALID_CUT_ARC, SCIP_NETROWADD::isArcCut, SCIP_NETROWADD::isArcCutReversed, SCIP_NETROWADD::leafMembers, SCIP_NETROWADD::memArtDFSData, SCIP_NETROWADD::memArticulationNodes, SCIP_NETROWADD::memberInformation, SCIP_NETROWADD::memChildrenStorage, SCIP_NETROWADD::memColorDFSData, SCIP_NETROWADD::memColumnArcs, SCIP_NETROWADD::memCreateReducedMembersCallstack, SCIP_NETROWADD::memCrossingPathCount, SCIP_NETROWADD::memCutArcs, SCIP_NETROWADD::memDecompositionColumnArcs, SCIP_NETROWADD::memIntersectionDFSData, SCIP_NETROWADD::memIntersectionPathDepth, SCIP_NETROWADD::memIntersectionPathParent, SCIP_NETROWADD::memIsArcCut, SCIP_NETROWADD::memLeafMembers, SCIP_NETROWADD::memMemberInformation, SCIP_NETROWADD::memMergeTreeCallData, SCIP_NETROWADD::memNodeColors, SCIP_NETROWADD::memNodeSearchInfo, SCIP_NETROWADD::memReducedComponents, SCIP_NETROWADD::memReducedMembers, SCIP_NETROWADD::memTemporaryColorArray, SCIP_NETROWADD::mergeTreeCallData, SCIP_NETROWADD::newColumnArcs, SCIP_NETROWADD::newColumnReversed, SCIP_NETROWADD::newRowIndex, SCIP_NETROWADD::nodeColors, NULL, SCIP_NETROWADD::numArticulationNodes, SCIP_NETROWADD::numChildrenStorage, SCIP_NETROWADD::numColumnArcs, SCIP_NETROWADD::numCutArcs, SCIP_NETROWADD::numDecompositionColumnArcs, SCIP_NETROWADD::numLeafMembers, SCIP_NETROWADD::numMemberInformation, SCIP_NETROWADD::numReducedComponents, SCIP_NETROWADD::numReducedMembers, SCIP_NETROWADD::reducedComponents, SCIP_NETROWADD::reducedMembers, SCIP_NETROWADD::remainsNetwork, SCIP_ALLOC, SCIP_OKAY, SPQR_INVALID_ROW, SCIP_NETROWADD::temporaryColorArray, and TRUE.

Referenced by SCIPnetmatdecTryAddRow().

◆ netrowaddFree()

static void netrowaddFree ( BMS_BLKMEM blkmem,
SCIP_NETROWADD **  prowadd 
)
static

Frees the network row addition data structure.

Parameters
blkmemBlock memory
prowaddPointer to row addition struct to be freed

Definition at line 11350 of file network.c.

References SCIP_NETROWADD::artDFSData, SCIP_NETROWADD::articulationNodes, SCIP_NETROWADD::articulationNodeSearchInfo, BMSfreeBlockMemory, BMSfreeBlockMemoryArray, SCIP_NETROWADD::childrenStorage, SCIP_NETROWADD::colorDFSData, SCIP_NETROWADD::createReducedMembersCallstack, SCIP_NETROWADD::crossingPathCount, SCIP_NETROWADD::cutArcs, SCIP_NETROWADD::decompositionColumnArcReversed, SCIP_NETROWADD::decompositionColumnArcs, SCIP_NETROWADD::intersectionDFSData, SCIP_NETROWADD::intersectionPathDepth, SCIP_NETROWADD::intersectionPathParent, SCIP_NETROWADD::isArcCut, SCIP_NETROWADD::isArcCutReversed, SCIP_NETROWADD::leafMembers, SCIP_NETROWADD::memArtDFSData, SCIP_NETROWADD::memArticulationNodes, SCIP_NETROWADD::memberInformation, SCIP_NETROWADD::memChildrenStorage, SCIP_NETROWADD::memColorDFSData, SCIP_NETROWADD::memColumnArcs, SCIP_NETROWADD::memCreateReducedMembersCallstack, SCIP_NETROWADD::memCrossingPathCount, SCIP_NETROWADD::memCutArcs, SCIP_NETROWADD::memDecompositionColumnArcs, SCIP_NETROWADD::memIntersectionDFSData, SCIP_NETROWADD::memIntersectionPathDepth, SCIP_NETROWADD::memIntersectionPathParent, SCIP_NETROWADD::memIsArcCut, SCIP_NETROWADD::memLeafMembers, SCIP_NETROWADD::memMemberInformation, SCIP_NETROWADD::memMergeTreeCallData, SCIP_NETROWADD::memNodeColors, SCIP_NETROWADD::memNodeSearchInfo, SCIP_NETROWADD::memReducedComponents, SCIP_NETROWADD::memReducedMembers, SCIP_NETROWADD::memTemporaryColorArray, SCIP_NETROWADD::mergeTreeCallData, SCIP_NETROWADD::newColumnArcs, SCIP_NETROWADD::newColumnReversed, SCIP_NETROWADD::nodeColors, SCIP_NETROWADD::reducedComponents, SCIP_NETROWADD::reducedMembers, and SCIP_NETROWADD::temporaryColorArray.

Referenced by SCIPnetmatdecFree().

◆ netrowaddCheck()

static SCIP_RETCODE netrowaddCheck ( SCIP_NETMATDECDATA dec,
SCIP_NETROWADD rowadd,
int  row,
const int *  nonzcols,
const double *  nonzvals,
int  nnonzs 
)
static

Checks if the given row can be added to the network decomposition.

Parameters
decThe network matrix decomposition
rowaddThe network matrix row addition data structure
rowThe row to be checked
nonzcolsThe column indices of the row's nonzero values
nonzvalsThe matrix entries of the row's nonzeroes
nnonzsThe number of nonzeroes in the row

Definition at line 11388 of file network.c.

References allocateRigidSearchMemory(), allocateTreeSearchMemory(), cleanUpPreviousIteration(), cleanUpRowMemberInformation(), constructRowReducedDecomposition(), createReducedDecompositionCutArcs(), determineLeafReducedMembers(), determineMergeableTypes(), netMatDecDataContainsRow(), newRowUpdateRowInformation(), SCIP_NETROWADD::numReducedComponents, propagateComponents(), SCIP_NETROWADD::reducedComponents, SCIP_NETROWADD::remainsNetwork, SPQRRowReducedComponent::root, SCIP_CALL, SCIP_INVALIDDATA, SCIP_OKAY, and TRUE.

Referenced by SCIPnetmatdecTryAddRow().

◆ netrowaddAdd()

◆ netrowaddRemainsNetwork()

static SCIP_Bool netrowaddRemainsNetwork ( const SCIP_NETROWADD rowadd)
static

Returns whether the last checked row can be added to the network decomposition.

Parameters
rowaddThe network matrix row addition data structure

Definition at line 11551 of file network.c.

References SCIP_NETROWADD::remainsNetwork.

Referenced by SCIPnetmatdecTryAddRow().