GCS: Full detection of dependent parameters with Dense Full Household pivoting QR decomposition

- Improve Debug information.
- Support for addition of constraints with driving information for the solver constraints.
- Removal of the driven constraints from the Jacobian for QR decomposition
- Removal of the value freewheeling parameter from the Jacobian for QR decomposition
- Full detection of dependent parameters where DoF are present for Dense QR.
This commit is contained in:
Abdullah Tahiri
2018-03-04 16:24:59 +01:00
committed by wmayer
parent d531e98eac
commit 858f4cb85b
2 changed files with 458 additions and 307 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -75,6 +75,7 @@ namespace GCS
// about partitioning into subsystems and solution strategies
private:
VEC_pD plist; // list of the unknown parameters
VEC_pD pdrivenlist; // list of parameters of driven constraints
MAP_pD_I pIndex;
VEC_pD pdependentparameters; // list of dependent parameters by the system
@@ -145,97 +146,97 @@ namespace GCS
void removeConstraint(Constraint *constr);
// basic constraints
int addConstraintEqual(double *param1, double *param2, int tagId=0);
int addConstraintEqual(double *param1, double *param2, int tagId=0, bool driving = true);
int addConstraintDifference(double *param1, double *param2,
double *difference, int tagId=0);
int addConstraintP2PDistance(Point &p1, Point &p2, double *distance, int tagId=0);
double *difference, int tagId=0, bool driving = true);
int addConstraintP2PDistance(Point &p1, Point &p2, double *distance, int tagId=0, bool driving = true);
int addConstraintP2PAngle(Point &p1, Point &p2, double *angle,
double incrAngle, int tagId=0);
int addConstraintP2PAngle(Point &p1, Point &p2, double *angle, int tagId=0);
int addConstraintP2LDistance(Point &p, Line &l, double *distance, int tagId=0);
int addConstraintPointOnLine(Point &p, Line &l, int tagId=0);
int addConstraintPointOnLine(Point &p, Point &lp1, Point &lp2, int tagId=0);
int addConstraintPointOnPerpBisector(Point &p, Line &l, int tagId=0);
int addConstraintPointOnPerpBisector(Point &p, Point &lp1, Point &lp2, int tagId=0);
int addConstraintParallel(Line &l1, Line &l2, int tagId=0);
int addConstraintPerpendicular(Line &l1, Line &l2, int tagId=0);
double incrAngle, int tagId=0, bool driving = true);
int addConstraintP2PAngle(Point &p1, Point &p2, double *angle, int tagId=0, bool driving = true);
int addConstraintP2LDistance(Point &p, Line &l, double *distance, int tagId=0, bool driving = true);
int addConstraintPointOnLine(Point &p, Line &l, int tagId=0, bool driving = true);
int addConstraintPointOnLine(Point &p, Point &lp1, Point &lp2, int tagId=0, bool driving = true);
int addConstraintPointOnPerpBisector(Point &p, Line &l, int tagId=0, bool driving = true);
int addConstraintPointOnPerpBisector(Point &p, Point &lp1, Point &lp2, int tagId=0, bool driving = true);
int addConstraintParallel(Line &l1, Line &l2, int tagId=0, bool driving = true);
int addConstraintPerpendicular(Line &l1, Line &l2, int tagId=0, bool driving = true);
int addConstraintPerpendicular(Point &l1p1, Point &l1p2,
Point &l2p1, Point &l2p2, int tagId=0);
int addConstraintL2LAngle(Line &l1, Line &l2, double *angle, int tagId=0);
Point &l2p1, Point &l2p2, int tagId=0, bool driving = true);
int addConstraintL2LAngle(Line &l1, Line &l2, double *angle, int tagId=0, bool driving = true);
int addConstraintL2LAngle(Point &l1p1, Point &l1p2, Point &l2p1, Point &l2p2,
double *angle, int tagId=0);
double *angle, int tagId=0, bool driving = true);
int addConstraintAngleViaPoint(Curve &crv1, Curve &crv2, Point &p,
double *angle, int tagId=0);
int addConstraintMidpointOnLine(Line &l1, Line &l2, int tagId=0);
double *angle, int tagId=0, bool driving = true);
int addConstraintMidpointOnLine(Line &l1, Line &l2, int tagId=0, bool driving = true);
int addConstraintMidpointOnLine(Point &l1p1, Point &l1p2, Point &l2p1, Point &l2p2,
int tagId=0);
int tagId=0, bool driving = true);
int addConstraintTangentCircumf(Point &p1, Point &p2, double *rd1, double *rd2,
bool internal=false, int tagId=0);
bool internal=false, int tagId=0, bool driving = true);
// derived constraints
int addConstraintP2PCoincident(Point &p1, Point &p2, int tagId=0);
int addConstraintHorizontal(Line &l, int tagId=0);
int addConstraintHorizontal(Point &p1, Point &p2, int tagId=0);
int addConstraintVertical(Line &l, int tagId=0);
int addConstraintVertical(Point &p1, Point &p2, int tagId=0);
int addConstraintCoordinateX(Point &p, double *x, int tagId=0);
int addConstraintCoordinateY(Point &p, double *y, int tagId=0);
int addConstraintArcRules(Arc &a, int tagId=0);
int addConstraintPointOnCircle(Point &p, Circle &c, int tagId=0);
int addConstraintPointOnEllipse(Point &p, Ellipse &e, int tagId=0);
int addConstraintPointOnHyperbolicArc(Point &p, ArcOfHyperbola &e, int tagId=0);
int addConstraintPointOnParabolicArc(Point &p, ArcOfParabola &e, int tagId=0);
int addConstraintArcOfEllipseRules(ArcOfEllipse &a, int tagId=0);
int addConstraintCurveValue(Point &p, Curve &a, double *u, int tagId=0);
int addConstraintArcOfHyperbolaRules(ArcOfHyperbola &a, int tagId=0);
int addConstraintArcOfParabolaRules(ArcOfParabola &a, int tagId=0);
int addConstraintPointOnArc(Point &p, Arc &a, int tagId=0);
int addConstraintP2PCoincident(Point &p1, Point &p2, int tagId=0, bool driving = true);
int addConstraintHorizontal(Line &l, int tagId=0, bool driving = true);
int addConstraintHorizontal(Point &p1, Point &p2, int tagId=0, bool driving = true);
int addConstraintVertical(Line &l, int tagId=0, bool driving = true);
int addConstraintVertical(Point &p1, Point &p2, int tagId=0, bool driving = true);
int addConstraintCoordinateX(Point &p, double *x, int tagId=0, bool driving = true);
int addConstraintCoordinateY(Point &p, double *y, int tagId=0, bool driving = true);
int addConstraintArcRules(Arc &a, int tagId=0, bool driving = true);
int addConstraintPointOnCircle(Point &p, Circle &c, int tagId=0, bool driving = true);
int addConstraintPointOnEllipse(Point &p, Ellipse &e, int tagId=0, bool driving = true);
int addConstraintPointOnHyperbolicArc(Point &p, ArcOfHyperbola &e, int tagId=0, bool driving = true);
int addConstraintPointOnParabolicArc(Point &p, ArcOfParabola &e, int tagId=0, bool driving = true);
int addConstraintArcOfEllipseRules(ArcOfEllipse &a, int tagId=0, bool driving = true);
int addConstraintCurveValue(Point &p, Curve &a, double *u, int tagId=0, bool driving = true);
int addConstraintArcOfHyperbolaRules(ArcOfHyperbola &a, int tagId=0, bool driving = true);
int addConstraintArcOfParabolaRules(ArcOfParabola &a, int tagId=0, bool driving = true);
int addConstraintPointOnArc(Point &p, Arc &a, int tagId=0, bool driving = true);
int addConstraintPerpendicularLine2Arc(Point &p1, Point &p2, Arc &a,
int tagId=0);
int tagId=0, bool driving = true);
int addConstraintPerpendicularArc2Line(Arc &a, Point &p1, Point &p2,
int tagId=0);
int tagId=0, bool driving = true);
int addConstraintPerpendicularCircle2Arc(Point &center, double *radius, Arc &a,
int tagId=0);
int tagId=0, bool driving = true);
int addConstraintPerpendicularArc2Circle(Arc &a, Point &center, double *radius,
int tagId=0);
int tagId=0, bool driving = true);
int addConstraintPerpendicularArc2Arc(Arc &a1, bool reverse1,
Arc &a2, bool reverse2, int tagId=0);
int addConstraintTangent(Line &l, Circle &c, int tagId=0);
int addConstraintTangent(Line &l, Ellipse &e, int tagId=0);
int addConstraintTangent(Line &l, Arc &a, int tagId=0);
int addConstraintTangent(Circle &c1, Circle &c2, int tagId=0);
int addConstraintTangent(Arc &a1, Arc &a2, int tagId=0);
int addConstraintTangent(Circle &c, Arc &a, int tagId=0);
Arc &a2, bool reverse2, int tagId=0, bool driving = true);
int addConstraintTangent(Line &l, Circle &c, int tagId=0, bool driving = true);
int addConstraintTangent(Line &l, Ellipse &e, int tagId=0, bool driving = true);
int addConstraintTangent(Line &l, Arc &a, int tagId=0, bool driving = true);
int addConstraintTangent(Circle &c1, Circle &c2, int tagId=0, bool driving = true);
int addConstraintTangent(Arc &a1, Arc &a2, int tagId=0, bool driving = true);
int addConstraintTangent(Circle &c, Arc &a, int tagId=0, bool driving = true);
int addConstraintCircleRadius(Circle &c, double *radius, int tagId=0);
int addConstraintArcRadius(Arc &a, double *radius, int tagId=0);
int addConstraintEqualLength(Line &l1, Line &l2, double *length, int tagId=0);
int addConstraintEqualRadius(Circle &c1, Circle &c2, int tagId=0);
int addConstraintEqualRadii(Ellipse &e1, Ellipse &e2, int tagId=0);
int addConstraintEqualRadii(ArcOfHyperbola &a1, ArcOfHyperbola &a2, int tagId=0);
int addConstraintEqualRadius(Circle &c1, Arc &a2, int tagId=0);
int addConstraintEqualRadius(Arc &a1, Arc &a2, int tagId=0);
int addConstraintEqualFocus(ArcOfParabola &a1, ArcOfParabola &a2, int tagId=0);
int addConstraintP2PSymmetric(Point &p1, Point &p2, Line &l, int tagId=0);
int addConstraintP2PSymmetric(Point &p1, Point &p2, Point &p, int tagId=0);
int addConstraintCircleRadius(Circle &c, double *radius, int tagId=0, bool driving = true);
int addConstraintArcRadius(Arc &a, double *radius, int tagId=0, bool driving = true);
int addConstraintEqualLength(Line &l1, Line &l2, double *length, int tagId=0, bool driving = true);
int addConstraintEqualRadius(Circle &c1, Circle &c2, int tagId=0, bool driving = true);
int addConstraintEqualRadii(Ellipse &e1, Ellipse &e2, int tagId=0, bool driving = true);
int addConstraintEqualRadii(ArcOfHyperbola &a1, ArcOfHyperbola &a2, int tagId=0, bool driving = true);
int addConstraintEqualRadius(Circle &c1, Arc &a2, int tagId=0, bool driving = true);
int addConstraintEqualRadius(Arc &a1, Arc &a2, int tagId=0, bool driving = true);
int addConstraintEqualFocus(ArcOfParabola &a1, ArcOfParabola &a2, int tagId=0, bool driving = true);
int addConstraintP2PSymmetric(Point &p1, Point &p2, Line &l, int tagId=0, bool driving = true);
int addConstraintP2PSymmetric(Point &p1, Point &p2, Point &p, int tagId=0, bool driving = true);
int addConstraintSnellsLaw(Curve &ray1, Curve &ray2,
Curve &boundary, Point p,
double* n1, double* n2,
bool flipn1, bool flipn2,
int tagId);
int tagId, bool driving = true);
// internal alignment constraints
int addConstraintInternalAlignmentPoint2Ellipse(Ellipse &e, Point &p1, InternalAlignmentType alignmentType, int tagId=0);
int addConstraintInternalAlignmentEllipseMajorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId=0);
int addConstraintInternalAlignmentEllipseMinorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId=0);
int addConstraintInternalAlignmentEllipseFocus1(Ellipse &e, Point &p1, int tagId=0);
int addConstraintInternalAlignmentEllipseFocus2(Ellipse &e, Point &p1, int tagId=0);
int addConstraintInternalAlignmentPoint2Hyperbola(Hyperbola &e, Point &p1, InternalAlignmentType alignmentType, int tagId=0);
int addConstraintInternalAlignmentHyperbolaMajorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0);
int addConstraintInternalAlignmentHyperbolaMinorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0);
int addConstraintInternalAlignmentHyperbolaFocus(Hyperbola &e, Point &p1, int tagId=0);
int addConstraintInternalAlignmentParabolaFocus(Parabola &e, Point &p1, int tagId=0);
int addConstraintInternalAlignmentBSplineControlPoint(BSpline &b, Circle &c, int poleindex, int tag=0);
int addConstraintInternalAlignmentPoint2Ellipse(Ellipse &e, Point &p1, InternalAlignmentType alignmentType, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentEllipseMajorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentEllipseMinorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentEllipseFocus1(Ellipse &e, Point &p1, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentEllipseFocus2(Ellipse &e, Point &p1, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentPoint2Hyperbola(Hyperbola &e, Point &p1, InternalAlignmentType alignmentType, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentHyperbolaMajorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentHyperbolaMinorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentHyperbolaFocus(Hyperbola &e, Point &p1, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentParabolaFocus(Parabola &e, Point &p1, int tagId=0, bool driving = true);
int addConstraintInternalAlignmentBSplineControlPoint(BSpline &b, Circle &c, int poleindex, int tag=0, bool driving = true);
double calculateAngleViaPoint(Curve &crv1, Curve &crv2, Point &p);
double calculateAngleViaPoint(Curve &crv1, Curve &crv2, Point &p1, Point &p2);
@@ -251,6 +252,7 @@ namespace GCS
void rescaleConstraint(int id, double coeff);
void declareUnknowns(VEC_pD &params);
void declareDrivenParams(VEC_pD &params);
void initSolution(Algorithm alg=DogLeg);
int solve(bool isFine=true, Algorithm alg=DogLeg, bool isRedundantsolving=false);