scipplan 0.1.0a2__py2.py3-none-any.whl → 0.1.0a3__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scipplan/__init__.py +1 -1
- scipplan/parse_model.py +68 -24
- {scipplan-0.1.0a2.dist-info → scipplan-0.1.0a3.dist-info}/METADATA +2 -2
- {scipplan-0.1.0a2.dist-info → scipplan-0.1.0a3.dist-info}/RECORD +8 -8
- {scipplan-0.1.0a2.dist-info → scipplan-0.1.0a3.dist-info}/LICENSE +0 -0
- {scipplan-0.1.0a2.dist-info → scipplan-0.1.0a3.dist-info}/WHEEL +0 -0
- {scipplan-0.1.0a2.dist-info → scipplan-0.1.0a3.dist-info}/entry_points.txt +0 -0
- {scipplan-0.1.0a2.dist-info → scipplan-0.1.0a3.dist-info}/top_level.txt +0 -0
scipplan/__init__.py
CHANGED
scipplan/parse_model.py
CHANGED
@@ -10,13 +10,68 @@ from math import exp, log, sqrt, sin, cos, isclose
|
|
10
10
|
|
11
11
|
from pyscipopt.scip import Model, SumExpr
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
|
14
|
+
def linearise(expr: ast.Compare, aux_var: Variable) -> tuple[ast.Compare, ast.Compare]:
|
15
|
+
"""linearise
|
16
|
+
This function linearises an inequality using an auxilary variable
|
17
|
+
|
18
|
+
The linearisation process is as follows.
|
19
|
+
If the expression is of the form of E1 <= E2, then we linearise by using the following expressions.
|
20
|
+
z=0 ==> E1 <= E2 and z=1 ==> E1 > E2 (equivalent to E1 >= E2 + feastol). This is then equivalent to,
|
21
|
+
E2 + feastol - M + z*M <= E1 <= E2 + zM.
|
22
|
+
|
23
|
+
Similarly, for E1 < E2 we have z=0 ==> E1 < E2 which is equivalent to E1 <= E2 - feastol + z*M
|
24
|
+
and z=1 ==> E1 >= E2.
|
25
|
+
Thus for E1 < E2 we have,
|
26
|
+
E2 + z*M - M <= E1 <= E2 + z*M - feastol.
|
27
|
+
|
28
|
+
If, however, the inequality is of the form of E1 >= E2 then we evaluate the expression, E2 <= E1.
|
29
|
+
Similarly, if the expression is E1 > E2 then we evaluate the expression E2 < E1.
|
30
|
+
|
31
|
+
:param expr: An inequality expression which is linearised.
|
32
|
+
:type expr: ast.Compare
|
33
|
+
:param aux_var: An auxiliary variable used when linearising the inequality to determine if the expression is true or false.
|
34
|
+
:type aux_var: Variable
|
35
|
+
:raises ValueError: If expr is not a valid inequality (i.e. doesn't use <, <=, > and >=)
|
36
|
+
:return: both the linearised inequalities
|
37
|
+
:rtype: tuple[ast.Compare, ast.Compare]
|
38
|
+
"""
|
39
|
+
if not isinstance(expr.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE)):
|
40
|
+
raise ValueError("Only <, <=, > or >= are allowed")
|
41
|
+
if isinstance(expr.ops[0], ast.GtE):
|
42
|
+
expr.left, expr.comparators[0] = expr.comparators[0], expr.left
|
43
|
+
expr.ops[0] = ast.LtE()
|
44
|
+
if isinstance(expr.ops[0], ast.Gt):
|
45
|
+
expr.left, expr.comparators[0] = expr.comparators[0], expr.left
|
46
|
+
expr.ops[0] = ast.Lt()
|
47
|
+
|
48
|
+
if isinstance(expr.ops[0], ast.LtE):
|
49
|
+
lhs = ast.BinOp(
|
50
|
+
left=expr.comparators[0],
|
51
|
+
op=ast.Add(),
|
52
|
+
right=ast.parse(f"feastol - bigM + {aux_var.name} * bigM").body[0].value
|
53
|
+
)
|
54
|
+
rhs = ast.BinOp(
|
55
|
+
left=expr.comparators[0],
|
56
|
+
op=ast.Add(),
|
57
|
+
right=ast.parse(f"{aux_var.name} * bigM").body[0].value
|
58
|
+
)
|
59
|
+
if isinstance(expr.ops[0], ast.Lt):
|
60
|
+
lhs = ast.BinOp(
|
61
|
+
left=expr.comparators[0],
|
62
|
+
op=ast.Add(),
|
63
|
+
right=ast.parse(f"{aux_var.name} * bigM - bigM").body[0].value
|
64
|
+
)
|
65
|
+
rhs = ast.BinOp(
|
66
|
+
left=expr.comparators[0],
|
67
|
+
op=ast.Add(),
|
68
|
+
right=ast.parse(f"{aux_var.name} * bigM - feastol").body[0].value
|
69
|
+
)
|
70
|
+
expr1 = ast.Compare(lhs, [ast.LtE()], [expr.left])
|
71
|
+
expr2 = ast.Compare(expr.left, [ast.LtE()], [rhs])
|
72
|
+
return expr1, expr2
|
73
|
+
|
74
|
+
|
20
75
|
|
21
76
|
@dataclass
|
22
77
|
class Expressions:
|
@@ -37,8 +92,8 @@ class Expressions:
|
|
37
92
|
|
38
93
|
class ParserType(Enum):
|
39
94
|
"""ParserType
|
40
|
-
|
41
|
-
|
95
|
+
enum type CALCULATOR: Used to calculate using feastol
|
96
|
+
enum type PARSER: Used to parse an expression and create the correct minlp constraints
|
42
97
|
"""
|
43
98
|
CALCULATOR = "calculator"
|
44
99
|
PARSER = "parser"
|
@@ -152,22 +207,11 @@ class ParseModel:
|
|
152
207
|
aux_vars.append(aux_var)
|
153
208
|
self.variables[aux_var.name] = aux_var.model_var
|
154
209
|
|
155
|
-
|
156
|
-
left=expr.left,
|
157
|
-
op=(ast.Add() if isinstance(expr.ops[0], (ast.Gt, ast.GtE)) else ast.Sub()),
|
158
|
-
right=ast.parse(f"bigM * {aux_var.name}").body[0].value
|
159
|
-
)
|
160
|
-
self.expressions.add_expressions(self.evaluate(expr))
|
210
|
+
expr1, expr2 = linearise(expr, aux_var)
|
161
211
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
left=expr.comparators[0],
|
166
|
-
op=(ast.Add() if isinstance(expr.ops[0], (ast.Gt, ast.GtE)) else ast.Sub()),
|
167
|
-
right=ast.parse(f"feastol - bigM").body[0].value
|
168
|
-
)
|
169
|
-
|
170
|
-
self.expressions.add_expressions(self.evaluate(expr))
|
212
|
+
self.expressions.add_expressions(self.evaluate(expr1))
|
213
|
+
self.expressions.add_expressions(self.evaluate(expr2))
|
214
|
+
|
171
215
|
else:
|
172
216
|
raise Exception("or expressions may only be made up of inequalities")
|
173
217
|
lhs = SumExpr()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: scipplan
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.0a3
|
4
4
|
Summary: Metric Hybrid Factored Planning in Nonlinear Domains with Constraint Generation in Python.
|
5
5
|
Author: Ari Gestetner, Buser Say
|
6
6
|
Author-email: ari.gestetner@monash.edu, buser.say@monash.edu
|
@@ -144,7 +144,7 @@ Location_y == 0.0
|
|
144
144
|
Speed_x == 0.0
|
145
145
|
Speed_y == 0.0
|
146
146
|
```
|
147
|
-
notice
|
147
|
+
notice the use of the constant value defined earlier in the constants file.
|
148
148
|
### Goals
|
149
149
|
The goals file should encode the final state values such that t=H+1, for example
|
150
150
|
```txt
|
@@ -1,7 +1,7 @@
|
|
1
|
-
scipplan/__init__.py,sha256=
|
1
|
+
scipplan/__init__.py,sha256=KScjrF1mIQbNUpdz4Ln6Ig5eA4ExpSUKSd1crpjyuv4,193
|
2
2
|
scipplan/config.py,sha256=0D6UcLjrv4PTjYRiPoIYXAsRu4nwcaOIWnsI4lAdK6Y,5221
|
3
3
|
scipplan/helpers.py,sha256=YwEr0NeDvb29_Ot686km3ZMJ-vHu-L8zjuexmlKDjpY,974
|
4
|
-
scipplan/parse_model.py,sha256
|
4
|
+
scipplan/parse_model.py,sha256=CI_38xmaiVr8DuOi3UdNrVqWHTdW6qm_5luwLZxIk9I,11136
|
5
5
|
scipplan/plan_model.py,sha256=daHnVHn2e89OtXXMl63QEoeKGOmy_LwT2oCRTjUUlKQ,11145
|
6
6
|
scipplan/scipplan.py,sha256=z6cuRug4amCg6LU7S4RYHcV6uT3vWLHYGRh9OXFkKoU,8225
|
7
7
|
scipplan/variables.py,sha256=3sxY3zQuxsa5z2fTFjv4zOSb9GarzojZ4W4kIx9FX68,2561
|
@@ -30,9 +30,9 @@ scipplan/translation/temporal_constraints_navigation_3.txt,sha256=Ki4nAX9-QtBbY9
|
|
30
30
|
scipplan/translation/transitions_navigation_1.txt,sha256=kfnr3_A9mCfflLsL4aq7OeR_BHSNST6eYuAg4ZxaPoU,411
|
31
31
|
scipplan/translation/transitions_navigation_2.txt,sha256=kfnr3_A9mCfflLsL4aq7OeR_BHSNST6eYuAg4ZxaPoU,411
|
32
32
|
scipplan/translation/transitions_navigation_3.txt,sha256=aIPP3FOjXZ3G6sTqicEIZ0JKJxdxHCRRZIdc5bUPFBM,395
|
33
|
-
scipplan-0.1.
|
34
|
-
scipplan-0.1.
|
35
|
-
scipplan-0.1.
|
36
|
-
scipplan-0.1.
|
37
|
-
scipplan-0.1.
|
38
|
-
scipplan-0.1.
|
33
|
+
scipplan-0.1.0a3.dist-info/LICENSE,sha256=tfR4peJA8KJtYEn1NzNV-LWQVRAserdq7OJgYghreR0,1057
|
34
|
+
scipplan-0.1.0a3.dist-info/METADATA,sha256=O1UnTCpE4vAdV1zmtvJ5jJKcqTErpVtxjlwHE9BO2wg,11234
|
35
|
+
scipplan-0.1.0a3.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110
|
36
|
+
scipplan-0.1.0a3.dist-info/entry_points.txt,sha256=3qiNbbp6qIwivyPmmikyp7ByCfmsa9rGFNJPcN9Is8I,52
|
37
|
+
scipplan-0.1.0a3.dist-info/top_level.txt,sha256=xO2FLRn7YQ-C25E8lagIEbik5T5FTr-Ta5bdiZezEPY,9
|
38
|
+
scipplan-0.1.0a3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|