@@ -12,8 +12,8 @@ import qualified Data.Set as Set
1212import Linear.Constraint.Generic.Types
1313 ( GenericConstraint (.. )
1414 )
15- import Linear.Constraint.Simple.Types (SimpleConstraint )
16- import Linear.Constraint.Types (Constraint )
15+ import Linear.Constraint.Simple.Types (SimpleConstraint ( .. ) )
16+ import Linear.Constraint.Types (Constraint ( .. ) )
1717import Linear.Expr.Types (Expr (.. ), ExprVarsOnly (.. ))
1818import Linear.Expr.Util
1919 ( exprToExprVarsOnly
@@ -34,31 +34,31 @@ import Linear.Var.Types (Var)
3434
3535substVarSimpleConstraintExpr ::
3636 Var -> Expr -> SimpleConstraint -> SimpleConstraint
37- substVarSimpleConstraintExpr var varReplacement (a :<= b) =
37+ substVarSimpleConstraintExpr var varReplacement (SimpleConstraint ( a :<= b) ) =
3838 let newExpr = substVarExpr var varReplacement (exprVarsOnlyToExpr a)
3939 newConstraint = newExpr :<= Expr [ConstTerm b]
40- in constraintToSimpleConstraint newConstraint
41- substVarSimpleConstraintExpr var varReplacement (a :>= b) =
40+ in constraintToSimpleConstraint $ Constraint newConstraint
41+ substVarSimpleConstraintExpr var varReplacement (SimpleConstraint ( a :>= b) ) =
4242 let newExpr = substVarExpr var varReplacement (exprVarsOnlyToExpr a)
4343 newConstraint = newExpr :>= Expr [ConstTerm b]
44- in constraintToSimpleConstraint newConstraint
45- substVarSimpleConstraintExpr var varReplacement (a :== b) =
44+ in constraintToSimpleConstraint $ Constraint newConstraint
45+ substVarSimpleConstraintExpr var varReplacement (SimpleConstraint ( a :== b) ) =
4646 let newExpr = substVarExpr var varReplacement (exprVarsOnlyToExpr a)
4747 newConstraint = newExpr :== Expr [ConstTerm b]
48- in constraintToSimpleConstraint newConstraint
48+ in constraintToSimpleConstraint $ Constraint newConstraint
4949
5050substVarSimpleConstraint ::
5151 Var -> ExprVarsOnly -> SimpleConstraint -> SimpleConstraint
52- substVarSimpleConstraint var varReplacement (a :<= b) = substVarExprVarsOnly var varReplacement a :<= b
53- substVarSimpleConstraint var varReplacement (a :>= b) = substVarExprVarsOnly var varReplacement a :>= b
54- substVarSimpleConstraint var varReplacement (a :== b) = substVarExprVarsOnly var varReplacement a :== b
52+ substVarSimpleConstraint var varReplacement (SimpleConstraint ( a :<= b)) = SimpleConstraint $ substVarExprVarsOnly var varReplacement a :<= b
53+ substVarSimpleConstraint var varReplacement (SimpleConstraint ( a :>= b)) = SimpleConstraint $ substVarExprVarsOnly var varReplacement a :>= b
54+ substVarSimpleConstraint var varReplacement (SimpleConstraint ( a :== b)) = SimpleConstraint $ substVarExprVarsOnly var varReplacement a :== b
5555
5656constraintToSimpleConstraint :: Constraint -> SimpleConstraint
5757constraintToSimpleConstraint constraint =
5858 case constraint of
59- (a :<= b) -> uncurry (:<=) (calcLhsRhs a b)
60- (a :>= b) -> uncurry (:>=) (calcLhsRhs a b)
61- (a :== b) -> uncurry (:==) (calcLhsRhs a b)
59+ Constraint (a :<= b) -> SimpleConstraint $ uncurry (:<=) (calcLhsRhs a b)
60+ Constraint (a :>= b) -> SimpleConstraint $ uncurry (:>=) (calcLhsRhs a b)
61+ Constraint (a :== b) -> SimpleConstraint $ uncurry (:==) (calcLhsRhs a b)
6262 where
6363 calcLhsRhs a b = (lhs, rhs)
6464 where
@@ -76,70 +76,28 @@ constraintToSimpleConstraint constraint =
7676 error $
7777 " constraintToSimpleConstraint: lhs is not ExprVarsOnly. Details: " <> err
7878
79- -- normalize simple constraints by moving all constants to the right
80- -- normalizeSimpleConstraint :: SimpleConstraint -> SimpleConstraint
81- -- normalizeSimpleConstraint (expr :<= num) =
82- -- let exprList = exprToList expr
83-
84- -- isConstTerm (ConstTerm _) = True
85- -- isConstTerm _ = False
86-
87- -- (sumExprConstTerms, nonConstTerms) = L.partition isConstTerm exprList
88-
89- -- constTermsVal = sum . map (\case (ConstTerm c) -> c; _ -> 0) $ sumExprConstTerms
90-
91- -- newExpr = listToExpr nonConstTerms
92- -- newNum = num - constTermsVal
93- -- in newExpr :<= newNum
94- -- normalizeSimpleConstraint (expr :>= num) =
95- -- let exprList = exprToList expr
96-
97- -- isConstTerm (ConstTerm _) = True
98- -- isConstTerm _ = False
99-
100- -- (sumExprConstTerms, nonConstTerms) = L.partition isConstTerm exprList
101-
102- -- constTermsVal = sum . map (\case (ConstTerm c) -> c; _ -> 0) $ sumExprConstTerms
103-
104- -- newExpr = listToExpr nonConstTerms
105- -- newNum = num - constTermsVal
106- -- in newExpr :>= newNum
107- -- normalizeSimpleConstraint (expr :== num) =
108- -- let exprList = exprToList expr
109-
110- -- isConstTerm (ConstTerm _) = True
111- -- isConstTerm _ = False
112-
113- -- (sumExprConstTerms, nonConstTerms) = L.partition isConstTerm exprList
114-
115- -- constTermsVal = sum . map (\case (ConstTerm c) -> c; _ -> 0) $ sumExprConstTerms
116-
117- -- newExpr = listToExpr nonConstTerms
118- -- newNum = num - constTermsVal
119- -- in newExpr :== newNum
120-
12179-- | Simplify coeff constraints by dividing the coefficient from both sides
12280simplifyCoeff :: SimpleConstraint -> SimpleConstraint
123- simplifyCoeff expr @ ( ExprVarsOnly [CoeffTermVO coeff var] :<= num)
124- | coeff == 0 = expr
125- | coeff > 0 = ExprVarsOnly [VarTermVO var] :<= (num / coeff)
126- | coeff < 0 = ExprVarsOnly [VarTermVO var] :>= (num / coeff)
127- simplifyCoeff expr @ ( ExprVarsOnly [CoeffTermVO coeff var] :>= num)
128- | coeff == 0 = expr
129- | coeff > 0 = ExprVarsOnly [VarTermVO var] :>= (num / coeff)
130- | coeff < 0 = ExprVarsOnly [VarTermVO var] :<= (num / coeff)
131- simplifyCoeff expr @ ( ExprVarsOnly [CoeffTermVO coeff var] :== num) =
81+ simplifyCoeff simpleConstraint @ ( SimpleConstraint ( ExprVarsOnly [CoeffTermVO coeff var] :<= num) )
82+ | coeff == 0 = simpleConstraint
83+ | coeff > 0 = SimpleConstraint $ ExprVarsOnly [VarTermVO var] :<= (num / coeff)
84+ | coeff < 0 = SimpleConstraint $ ExprVarsOnly [VarTermVO var] :>= (num / coeff)
85+ simplifyCoeff simpleConstraint @ ( SimpleConstraint ( ExprVarsOnly [CoeffTermVO coeff var] :>= num) )
86+ | coeff == 0 = simpleConstraint
87+ | coeff > 0 = SimpleConstraint $ ExprVarsOnly [VarTermVO var] :>= (num / coeff)
88+ | coeff < 0 = SimpleConstraint $ ExprVarsOnly [VarTermVO var] :<= (num / coeff)
89+ simplifyCoeff simpleConstraint @ ( SimpleConstraint ( ExprVarsOnly [CoeffTermVO coeff var] :== num) ) =
13290 if coeff == 0
133- then expr
134- else ExprVarsOnly [VarTermVO var] :== (num / coeff)
135- simplifyCoeff expr = expr
91+ then simpleConstraint
92+ else SimpleConstraint $ ExprVarsOnly [VarTermVO var] :== (num / coeff)
93+ simplifyCoeff simpleConstraint = simpleConstraint
13694
13795simplifySimpleConstraint :: SimpleConstraint -> SimpleConstraint
138- simplifySimpleConstraint (expr :<= num) = simplifyCoeff $ simplifyExprVarsOnly expr :<= num
139- simplifySimpleConstraint (expr :>= num) = simplifyCoeff $ simplifyExprVarsOnly expr :>= num
140- simplifySimpleConstraint (expr :== num) = simplifyCoeff $ simplifyExprVarsOnly expr :== num
96+ simplifySimpleConstraint (SimpleConstraint ( expr :<= num)) = simplifyCoeff . SimpleConstraint $ simplifyExprVarsOnly expr :<= num
97+ simplifySimpleConstraint (SimpleConstraint ( expr :>= num)) = simplifyCoeff . SimpleConstraint $ simplifyExprVarsOnly expr :>= num
98+ simplifySimpleConstraint (SimpleConstraint ( expr :== num)) = simplifyCoeff . SimpleConstraint $ simplifyExprVarsOnly expr :== num
14199
142100simpleConstraintVars :: SimpleConstraint -> Set. Set Var
143- simpleConstraintVars (expr :<= _) = exprVars . exprVarsOnlyToExpr $ expr
144- simpleConstraintVars (expr :>= _) = exprVars . exprVarsOnlyToExpr $ expr
145- simpleConstraintVars (expr :== _) = exprVars . exprVarsOnlyToExpr $ expr
101+ simpleConstraintVars (SimpleConstraint ( expr :<= _) ) = exprVars . exprVarsOnlyToExpr $ expr
102+ simpleConstraintVars (SimpleConstraint ( expr :>= _) ) = exprVars . exprVarsOnlyToExpr $ expr
103+ simpleConstraintVars (SimpleConstraint ( expr :== _) ) = exprVars . exprVarsOnlyToExpr $ expr
0 commit comments