Adaptagrams
compound_constraints.h
1 /*
2  * vim: ts=4 sw=4 et tw=0 wm=0
3  *
4  * libcola - A library providing force-directed network layout using the
5  * stress-majorization method subject to separation constraints.
6  *
7  * Copyright (C) 2006-2008 Monash University
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  * See the file LICENSE.LGPL distributed with the library.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18  *
19 */
20 
21 #ifndef _COMPOUND_CONSTRAINTS_H
22 #define _COMPOUND_CONSTRAINTS_H
23 
24 #include <vector>
25 #include <list>
26 #include <set>
27 #include <utility>
28 
29 #include "libvpsc/rectangle.h"
30 #include "libvpsc/constraint.h"
31 #include "libcola/sparse_matrix.h"
32 #include "libcola/unused.h"
33 
34 namespace vpsc {
35  class Constraint;
36  class Variable;
37 
38 // Avoid SWIG redefinition warnings.
39 #ifndef SWIG
40  typedef std::vector<vpsc::Constraint *> Constraints;
41  typedef std::vector<vpsc::Variable *> Variables;
42 #endif
43 }
44 namespace cola {
45 
46 class Cluster;
47 class RootCluster;
48 
49 
50 // A component of a CompoundConstraint.
51 class SubConstraint
52 {
53  public:
54  SubConstraint(vpsc::Dim dim, vpsc::Constraint constraint,
55  double cost = 0)
56  : dim(dim),
57  constraint(constraint),
58  cost(cost)
59  {
60  }
61  bool operator<(const SubConstraint& rhs) const
62  {
63  return cost < rhs.cost;
64  }
65 
66  vpsc::Dim dim;
67  vpsc::Constraint constraint;
68  double cost;
69 };
70 
71 
72 // A list of alternative SubConstraints.
73 typedef std::list<SubConstraint> SubConstraintAlternatives;
74 
75 static const double freeWeight = 0.0001;
76 
77 static const unsigned int DEFAULT_CONSTRAINT_PRIORITY = 30000;
78 static const unsigned int PRIORITY_NONOVERLAP =
79  DEFAULT_CONSTRAINT_PRIORITY - 2000;
80 
94 {
95  public:
96  VariableIDMap();
97  ~VariableIDMap();
98 
106  bool addMappingForVariable(const unsigned from, const unsigned to);
107  unsigned mappingForVariable(const unsigned var,
108  bool forward = true) const;
109  void clear(void);
110  void printCreationCode(FILE *fp) const;
111 
112  private:
113  std::list<std::pair<unsigned, unsigned> > m_mapping;
114 };
115 
116 class SubConstraintInfo
117 {
118  public:
119  SubConstraintInfo(unsigned ind) :
120  varIndex(ind),
121  satisfied(false)
122  {
123  }
124  virtual ~SubConstraintInfo()
125  {
126  }
127  virtual void updateVarIDsWithMapping(const VariableIDMap& idMap,
128  bool forward);
129 
130  unsigned varIndex;
131  bool satisfied;
132 };
133 
134 typedef std::vector<SubConstraintInfo *> SubConstraintInfoList;
135 
136 
147 public:
148  CompoundConstraint(vpsc::Dim primaryDim,
149  unsigned int priority = DEFAULT_CONSTRAINT_PRIORITY);
167  virtual void generateVariables(const vpsc::Dim dim,
168  vpsc::Variables& vars) = 0;
184  virtual void generateSeparationConstraints(const vpsc::Dim dim,
186  vpsc::Rectangles& bbs) = 0;
197  virtual void updatePosition(const vpsc::Dim dim)
198  {
199  COLA_UNUSED(dim);
200  }
201 
207  virtual std::string toString(void) const = 0;
208 
209 // To prevent C++ objects from being destroyed in garbage collected languages
210 // when the libraries are called from SWIG, we hide the declarations of the
211 // destructors and prevent generation of default destructors.
212 #ifndef SWIG
213  virtual ~CompoundConstraint();
214 #endif
215 
216  vpsc::Dim dimension(void) const;
217  unsigned int priority(void) const;
218  virtual void updateVarIDsWithMapping(const VariableIDMap& idMap,
219  bool forward = true);
220  virtual void updateShapeOffsetsForDifferentCentres(
221  const std::vector<double>& offsets, bool forward = true)
222  {
223  COLA_UNUSED(offsets);
224  COLA_UNUSED(forward);
225  }
226 
227  // The following methods are only needed for initially solving feasibility
228  // of the constraints, and do not need to be implemented for most compound
229  // constraints.
230  virtual void markAllSubConstraintsAsInactive(void);
231  virtual bool subConstraintsRemaining(void) const;
232  virtual void markCurrSubConstraintAsActive(const bool satisfiable);
233  virtual SubConstraintAlternatives getCurrSubConstraintAlternatives(
234  vpsc::Variables vs[]) = 0;
235  std::list<unsigned> subConstraintObjIndexes(void) const;
236  virtual void printCreationCode(FILE *fp) const;
237  bool shouldCombineSubConstraints(void) const;
238 
239 protected:
240  void assertValidVariableIndex(const vpsc::Variables& vars,
241  const unsigned index);
242 
243  // The dimension that this compound constraint operates.
244  vpsc::Dim _primaryDim;
245  // The alternate dimension.
246  vpsc::Dim _secondaryDim;
247  // The priority used to assign order for solving constraints.
248  unsigned int _priority;
249  // Describes whether to process sub constraints individually, or all
250  // at once, during the makeFeasible opteration.
251  bool _combineSubConstraints;
252 
253  // Info about the sub constraints within this compound constraint.
254  SubConstraintInfoList _subConstraintInfo;
255  // The index of the current subConstraint being made feasible.
256  size_t _currSubConstraintIndex;
257 };
259 typedef std::vector<CompoundConstraint *> CompoundConstraints;
260 
261 
267  const vpsc::Dim dim, vpsc::Variables& vars, vpsc::Constraints& cs,
268  vpsc::Rectangles& bbs);
269 
270 
275 void generateVariables(CompoundConstraints& ccs, const vpsc::Dim dim,
276  vpsc::Variables& vars);
277 
278 
289 {
290  public:
297  BoundaryConstraint(const vpsc::Dim dim);
307  void addShape(const unsigned int index, const double offset);
308 
314  std::string toString(void) const;
315 
316  SubConstraintAlternatives getCurrSubConstraintAlternatives(
317  vpsc::Variables vs[]);
318  void generateVariables(const vpsc::Dim dim, vpsc::Variables& vars);
321  vpsc::Rectangles& bbs);
322  void updatePosition(const vpsc::Dim dim);
323  void printCreationCode(FILE *fp) const;
324 
326  double position;
327 
328  vpsc::Variable* variable;
329 };
330 
331 
346 {
347  public:
354  AlignmentConstraint(const vpsc::Dim dim, double position = 0.0);
365  void addShape(const unsigned int index, const double offset);
374  void fixPos(double pos);
380  void unfixPos(void);
387  bool isFixed(void) const;
388 
394  std::string toString(void) const;
395 
396  SubConstraintAlternatives getCurrSubConstraintAlternatives(
397  vpsc::Variables vs[]);
398  void generateVariables(const vpsc::Dim dim, vpsc::Variables& vars);
401  vpsc::Rectangles& bbs);
402  void updatePosition(const vpsc::Dim dim);
403  double position(void) const;
404  void printCreationCode(FILE *fp) const;
405  void updateShapeOffsetsForDifferentCentres(
406  const std::vector<double>& offsets, bool forward = true);
407 
410  void *indicator;
411 
412  vpsc::Variable* variable;
413  private:
414  // The position of the alignment line
415  double _position;
416  bool _isFixed;
417 };
418 
419 
433 {
434  public:
450  SeparationConstraint(const vpsc::Dim dim, unsigned l, unsigned r,
451  double g, bool equality = false);
469  AlignmentConstraint *r, double g, bool equality = false);
470 
476  std::string toString(void) const;
477 
478  SubConstraintAlternatives getCurrSubConstraintAlternatives(
479  vpsc::Variables vs[]);
480  void generateVariables(const vpsc::Dim dim, vpsc::Variables& vars);
483  vpsc::Rectangles& bbs);
484  void setSeparation(double gap);
485  unsigned left(void) const;
486  unsigned right(void) const;
487  void printCreationCode(FILE *fp) const;
488 
489  double gap;
490  bool equality;
491  vpsc::Constraint *vpscConstraint;
492 };
493 
494 
495 // XXX: This is experimental
496 //
497 // Orthogonal edges must have their end points aligned horizontally or
498 // vertically
499 class OrthogonalEdgeConstraint : public CompoundConstraint
500 {
501  public:
502  OrthogonalEdgeConstraint(const vpsc::Dim dim, unsigned l, unsigned r);
503 
504  SubConstraintAlternatives getCurrSubConstraintAlternatives(
505  vpsc::Variables vs[]);
506  void generateVariables(const vpsc::Dim dim, vpsc::Variables& vars);
507  void generateSeparationConstraints(const vpsc::Dim dim,
509  vpsc::Rectangles& bbs);
510  void generateTopologyConstraints(const vpsc::Dim k,
511  vpsc::Rectangles const& rs,
512  std::vector<vpsc::Variable*> const& vars,
513  std::vector<vpsc::Constraint*>& cs);
514  void printCreationCode(FILE *fp) const;
515  std::string toString(void) const;
516 
517  unsigned left;
518  unsigned right;
519  vpsc::Constraint* vpscConstraint;
520  private:
521  void rectBounds(const vpsc::Dim k, vpsc::Rectangle const *r,
522  double& cmin, double& cmax, double& centre, double& l) const;
523 };
524 
525 
535 {
536  public:
547  MultiSeparationConstraint(const vpsc::Dim dim, double minSep = 0,
548  bool equality = false);
565  AlignmentConstraint *ac2);
573  void setSeparation(double sep);
574 
580  std::string toString(void) const;
581 
582  SubConstraintAlternatives getCurrSubConstraintAlternatives(
583  vpsc::Variables vs[]);
584  void generateVariables(const vpsc::Dim dim, vpsc::Variables& vars);
587  vpsc::Rectangles& bbs);
588  void printCreationCode(FILE *fp) const;
589 
591 
594  void *indicator;
595 
596  double sep;
597  bool equality;
598 };
599 
600 
612  public:
634  AlignmentConstraint *ac2);
642  void setSeparation(double sep);
643 
649  std::string toString(void) const;
650 
651  SubConstraintAlternatives getCurrSubConstraintAlternatives(
652  vpsc::Variables vs[]);
653  void generateVariables(const vpsc::Dim dim, vpsc::Variables& vars);
656  vpsc::Rectangles& bbs);
657  void printCreationCode(FILE *fp) const;
658 
660 
663  void *indicator;
664 
665  double sep;
666 };
667 
680  public:
694  std::vector<unsigned> shapeIds,
695  const bool fixedPosition = false);
696 
702  std::string toString(void) const;
703 
704  SubConstraintAlternatives getCurrSubConstraintAlternatives(
705  vpsc::Variables vs[]);
706  void generateVariables(const vpsc::Dim dim, vpsc::Variables& vars);
709  vpsc::Rectangles& bbs);
710  void printCreationCode(FILE *fp) const;
711  void updateVarIDsWithMapping(const VariableIDMap& idMap,
712  bool forward = true);
713 
714  private:
715  bool m_fixed_position;
716  std::vector<unsigned> m_shape_vars;
717 };
718 
719 
731  public:
743  PageBoundaryConstraints(double xLow, double xHigh,
744  double yLow, double yHigh, double weight = 100.0);
753  void addShape(unsigned index, double halfW, double halfH);
754 
760  std::string toString(void) const;
761 
762  SubConstraintAlternatives getCurrSubConstraintAlternatives(
763  vpsc::Variables vs[]);
764  void generateVariables(const vpsc::Dim dim, vpsc::Variables& vars);
767  vpsc::Rectangles& bbs);
768  void updatePosition(const vpsc::Dim dim);
769  double getActualLeftMargin(const vpsc::Dim dim);
770  double getActualRightMargin(const vpsc::Dim dim);
771  void printCreationCode(FILE *fp) const;
772 
773  private:
774  double leftMargin[2];
775  double rightMargin[2];
776  double actualLeftMargin[2];
777  double actualRightMargin[2];
778  double leftWeight[2];
779  double rightWeight[2];
780  vpsc::Variable *vl[2], *vr[2];
781 };
782 
783 
789  public:
791 
793  unsigned leftVarIndex;
795  unsigned rightVarIndex;
797  double separation;
799  bool equality;
802 
803  std::string toString(void) const
804  {
805  std::stringstream stream;
806  stream << "Unsatisfiable constraint: var(" << leftVarIndex << ") ";
807  if (separation < 0)
808  {
809  stream << "- " << -separation;
810  }
811  else
812  {
813  stream << "+ " << separation;
814  }
815  stream << " " << ((equality) ? "== " : "<= ");
816  stream << "var(" << rightVarIndex << ")";
817  if (cc)
818  {
819  stream << "\n From " << cc->toString();
820  }
821 
822  return stream.str();
823  }
824 };
826 typedef std::vector<UnsatisfiableConstraintInfo *> UnsatisfiableConstraintInfos;
827 
828 } // namespace cola
829 #endif // _COMPOUND_CONSTRAINTS_H
void * indicator
Definition: compound_constraints.h:410
A variable is comprised of an ideal position, final position and a weight.
Definition: variable.h:44
bool equality
Whether the separation is an exact distance or not.
Definition: compound_constraints.h:799
void generateVariablesAndConstraints(CompoundConstraints &ccs, const vpsc::Dim dim, vpsc::Variables &vars, vpsc::Constraints &cs, vpsc::Rectangles &bbs)
Generate all the variables and constraints for a collection of CompoundConstraints.
Definition: compound_constraints.cpp:1455
A fixed-relative constraint specifies that a group of nodes are constrained to be fixed in position r...
Definition: compound_constraints.h:679
std::string toString(void) const
Returns a textual description of the compound constraint.
Definition: compound_constraints.cpp:1155
void generateVariables(const vpsc::Dim dim, vpsc::Variables &vars)
Implemented by the compound constraint to generate any additional required variables in the given dim...
Definition: compound_constraints.cpp:814
MultiSeparationConstraint(const vpsc::Dim dim, double minSep=0, bool equality=false)
Constructs a new empty MultiSeparationConstraint with a minimum or exact spacing. ...
Definition: compound_constraints.cpp:750
void fixPos(double pos)
Mark the alignment as ideally having a fixed position.
Definition: compound_constraints.cpp:237
Holds a mapping between two sets of Variable indices.
Definition: compound_constraints.h:93
double position
Holds the position of the boundary line, once layout is complete.
Definition: compound_constraints.h:326
PageBoundaryConstraints(double xLow, double xHigh, double yLow, double yHigh, double weight=100.0)
Constructs a new PageBoundaryConstraints object with given page boundary positions and weight...
Definition: compound_constraints.cpp:1241
void addAlignmentPair(AlignmentConstraint *ac1, AlignmentConstraint *ac2)
Mark a pair of alignment constraints as being part of this multi separation constraint.
Definition: compound_constraints.cpp:760
bool isFixed(void) const
Indicates if the alignment position is marked as fixed.
Definition: compound_constraints.cpp:255
void addAlignmentPair(AlignmentConstraint *ac1, AlignmentConstraint *ac2)
Mark a pair of alignment constraints as being part of this distribution constraint.
Definition: compound_constraints.cpp:895
Info about constraints that could not be satisfied in gradient projection process.
Definition: compound_constraints.h:788
An alignment constraint specifies a alignment line that a set of nodes must be constrained to by an e...
Definition: compound_constraints.h:345
BoundaryConstraint(const vpsc::Dim dim)
Constructs a new BoundaryConstraint in the specified dimension.
Definition: compound_constraints.cpp:63
void addShape(const unsigned int index, const double offset)
Mark a node as being part of this alignment constraint.
Definition: compound_constraints.cpp:221
void generateSeparationConstraints(const vpsc::Dim dim, vpsc::Variables &vars, vpsc::Constraints &gcs, vpsc::Rectangles &bbs)
Implemented by the compound constraint to generate the low-level separation constraints in the given ...
Definition: compound_constraints.cpp:1380
void setSeparation(double sep)
Alter the exact spacing between each pair of alignment constraints.
Definition: compound_constraints.cpp:912
void updatePosition(const vpsc::Dim dim)
Implemented by the compound constraint to send position information back to the interface.
Definition: compound_constraints.cpp:228
void addShape(unsigned index, double halfW, double halfH)
Mark a node as being contained within this page boundary.
Definition: compound_constraints.cpp:1265
libvpsc: Variable Placement with Separation Constraints quadratic program solver library.
Definition: assertions.h:61
std::vector< Variable * > Variables
A vector of pointers to Variable objects.
Definition: constraint.h:38
void updatePosition(const vpsc::Dim dim)
Implemented by the compound constraint to send position information back to the interface.
Definition: compound_constraints.cpp:1334
SeparationConstraint(const vpsc::Dim dim, unsigned l, unsigned r, double g, bool equality=false)
Constructs a new SeparationConstraint between two nodes in the specified dimension.
Definition: compound_constraints.cpp:443
unsigned rightVarIndex
The index of the right variable.
Definition: compound_constraints.h:795
std::string toString(void) const
Returns a textual description of the compound constraint.
Definition: compound_constraints.cpp:346
void generateVariables(const vpsc::Dim dim, vpsc::Variables &vars)
Implemented by the compound constraint to generate any additional required variables in the given dim...
Definition: compound_constraints.cpp:1360
std::vector< Constraint * > Constraints
A vector of pointers to Constraint objects.
Definition: constraint.h:125
void generateVariables(const vpsc::Dim dim, vpsc::Variables &vars)
Implemented by the compound constraint to generate any additional required variables in the given dim...
Definition: compound_constraints.cpp:902
void updatePosition(const vpsc::Dim dim)
Implemented by the compound constraint to send position information back to the interface.
Definition: compound_constraints.cpp:71
std::vector< Rectangle * > Rectangles
A vector of pointers to Rectangle objects.
Definition: rectangle.h:246
A constraint determines a minimum or exact spacing required between two Variable objects.
Definition: constraint.h:44
void generateSeparationConstraints(const vpsc::Dim dim, vpsc::Variables &vars, vpsc::Constraints &gcs, vpsc::Rectangles &bbs)
Implemented by the compound constraint to generate the low-level separation constraints in the given ...
Definition: compound_constraints.cpp:988
void generateSeparationConstraints(const vpsc::Dim dim, vpsc::Variables &vs, vpsc::Constraints &cs, vpsc::Rectangles &bbs)
Implemented by the compound constraint to generate the low-level separation constraints in the given ...
Definition: compound_constraints.cpp:548
unsigned leftVarIndex
The index of the left variable.
Definition: compound_constraints.h:793
void unfixPos(void)
Mark the alignment as not having a fixed position.
Definition: compound_constraints.cpp:244
void generateSeparationConstraints(const vpsc::Dim dim, vpsc::Variables &vars, vpsc::Constraints &cs, vpsc::Rectangles &bbs)
Implemented by the compound constraint to generate the low-level separation constraints in the given ...
Definition: compound_constraints.cpp:140
void generateVariables(const vpsc::Dim dim, vpsc::Variables &vars)
Implemented by the compound constraint to generate any additional required variables in the given dim...
Definition: compound_constraints.cpp:519
bool addMappingForVariable(const unsigned from, const unsigned to)
Adds a mapping between a pair of variables.
Definition: compound_constraints.cpp:1597
void generateSeparationConstraints(const vpsc::Dim dim, vpsc::Variables &vars, vpsc::Constraints &cs, vpsc::Rectangles &bbs)
Implemented by the compound constraint to generate the low-level separation constraints in the given ...
Definition: compound_constraints.cpp:277
std::string toString(void) const
Returns a textual description of the compound constraint.
Definition: compound_constraints.cpp:104
std::string toString(void) const
Returns a textual description of the compound constraint.
Definition: compound_constraints.cpp:940
void generateVariables(const vpsc::Dim dim, vpsc::Variables &vars)
Implemented by the compound constraint to generate any additional required variables in the given dim...
Definition: compound_constraints.cpp:1115
AlignmentConstraint(const vpsc::Dim dim, double position=0.0)
Constructs a new AlignmentConstraint in the specified dimension.
Definition: compound_constraints.cpp:211
void generateVariables(const vpsc::Dim dim, vpsc::Variables &vars)
Implemented by the compound constraint to generate any additional required variables in the given dim...
Definition: compound_constraints.cpp:260
A boundary constraint specifies a bounding line that a set of nodes must be either to the left or rig...
Definition: compound_constraints.h:288
A rectangle represents a fixed-size shape in the diagram that may be moved to prevent overlaps and sa...
Definition: rectangle.h:78
virtual std::string toString(void) const =0
Returns a textual description of the compound constraint.
void generateVariables(const vpsc::Dim dim, vpsc::Variables &vars)
Implemented by the compound constraint to generate any additional required variables in the given dim...
Definition: compound_constraints.cpp:127
virtual void generateSeparationConstraints(const vpsc::Dim dim, vpsc::Variables &var, vpsc::Constraints &cs, vpsc::Rectangles &bbs)=0
Implemented by the compound constraint to generate the low-level separation constraints in the given ...
void * indicator
Definition: compound_constraints.h:594
cola::CompoundConstraint * cc
The index of the CompoundConstraint that created this.
Definition: compound_constraints.h:801
DistributionConstraint(const vpsc::Dim dim)
Constructs a new empty DistributionConstraint with a minimum or exact spacing.
Definition: compound_constraints.cpp:888
void setSeparation(double sep)
Alter the minimum or exact spacing between each pair of alignment constraints.
Definition: compound_constraints.cpp:849
libcola: Force-directed network layout subject to separation constraints library. ...
Definition: box.cpp:25
Dim
Indicates the x- or y-dimension.
Definition: rectangle.h:41
std::string toString(void) const
Returns a textual description of the compound constraint.
Definition: compound_constraints.cpp:788
std::string toString(void) const
Returns a textual description of the compound constraint.
Definition: compound_constraints.cpp:495
void generateSeparationConstraints(const vpsc::Dim dim, vpsc::Variables &vars, vpsc::Constraints &gcs, vpsc::Rectangles &bbs)
Implemented by the compound constraint to generate the low-level separation constraints in the given ...
Definition: compound_constraints.cpp:1197
std::vector< UnsatisfiableConstraintInfo * > UnsatisfiableConstraintInfos
A vector of pointers to UnsatisfiableConstraintInfo objects.
Definition: compound_constraints.h:826
void * indicator
Definition: compound_constraints.h:663
std::string toString(void) const
Returns a textual description of the compound constraint.
Definition: compound_constraints.cpp:1292
virtual void generateVariables(const vpsc::Dim dim, vpsc::Variables &vars)=0
Implemented by the compound constraint to generate any additional required variables in the given dim...
A multi-separation constraint Specifies a set of horizontal or vertical equal spacing constraints bet...
Definition: compound_constraints.h:534
void generateSeparationConstraints(const vpsc::Dim dim, vpsc::Variables &vs, vpsc::Constraints &gcs, vpsc::Rectangles &bbs)
Implemented by the compound constraint to generate the low-level separation constraints in the given ...
Definition: compound_constraints.cpp:855
An abstract base class for all high-level compound constraints.
Definition: compound_constraints.h:146
std::vector< CompoundConstraint * > CompoundConstraints
A vector of pointers to CompoundConstraint objects.
Definition: compound_constraints.h:259
FixedRelativeConstraint(const vpsc::Rectangles &rs, std::vector< unsigned > shapeIds, const bool fixedPosition=false)
Constructs a new FixedRelativeConstraint between a set of nodes, optionally with a fixed position...
Definition: compound_constraints.cpp:1062
A separation constraint specifies a simple horizontal or vertical spacing constraint between 2 nodes ...
Definition: compound_constraints.h:432
virtual void updatePosition(const vpsc::Dim dim)
Implemented by the compound constraint to send position information back to the interface.
Definition: compound_constraints.h:197
double separation
The separation.
Definition: compound_constraints.h:797
void addShape(const unsigned int index, const double offset)
Mark a node as being part of this boundary constraint.
Definition: compound_constraints.cpp:80
A page boundary contraint specifies constraints that attempt to keep the given nodes within a defined...
Definition: compound_constraints.h:730
void generateVariables(CompoundConstraints &ccs, const vpsc::Dim dim, vpsc::Variables &vars)
Generate just all the variables for a collection of CompoundConstraints.
Definition: compound_constraints.cpp:1466
A distribution constraint specifies an ordered set of alignment constraints and a fixed separation re...
Definition: compound_constraints.h:611