scipplan 0.2.0a2__py2.py3-none-any.whl → 0.2.2a0__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.
- build/lib/scipplan/__init__.py +5 -0
- build/lib/scipplan/config.py +163 -0
- build/lib/scipplan/helpers.py +31 -0
- build/lib/scipplan/parse_model.py +284 -0
- build/lib/scipplan/plan_model.py +339 -0
- build/lib/scipplan/scipplan.py +218 -0
- build/lib/scipplan/variables.py +91 -0
- build/lib/scipplan/zero_crossing.py +29 -0
- scipplan/__init__.py +3 -3
- scipplan/parse_model.py +71 -26
- scipplan/plan_model.py +12 -9
- scipplan/scipplan.py +18 -16
- scipplan/zero_crossing.py +2 -1
- {scipplan-0.2.0a2.dist-info → scipplan-0.2.2a0.dist-info}/LICENSE +1 -1
- scipplan-0.2.2a0.dist-info/METADATA +105 -0
- scipplan-0.2.2a0.dist-info/RECORD +28 -0
- {scipplan-0.2.0a2.dist-info → scipplan-0.2.2a0.dist-info}/WHEEL +1 -1
- scipplan-0.2.2a0.dist-info/top_level.txt +5 -0
- scipplan/translation/constants_navigation_1.txt +0 -2
- scipplan/translation/constants_navigation_2.txt +0 -2
- scipplan/translation/constants_navigation_3.txt +0 -1
- scipplan/translation/goals_navigation_1.txt +0 -2
- scipplan/translation/goals_navigation_2.txt +0 -2
- scipplan/translation/goals_navigation_3.txt +0 -2
- scipplan/translation/initials_navigation_1.txt +0 -4
- scipplan/translation/initials_navigation_2.txt +0 -4
- scipplan/translation/initials_navigation_3.txt +0 -4
- scipplan/translation/instantaneous_constraints_navigation_1.txt +0 -9
- scipplan/translation/instantaneous_constraints_navigation_2.txt +0 -10
- scipplan/translation/instantaneous_constraints_navigation_3.txt +0 -11
- scipplan/translation/pvariables_navigation_1.txt +0 -8
- scipplan/translation/pvariables_navigation_2.txt +0 -8
- scipplan/translation/pvariables_navigation_3.txt +0 -8
- scipplan/translation/reward_navigation_1.txt +0 -1
- scipplan/translation/reward_navigation_2.txt +0 -1
- scipplan/translation/reward_navigation_3.txt +0 -1
- scipplan/translation/temporal_constraints_navigation_1.txt +0 -6
- scipplan/translation/temporal_constraints_navigation_2.txt +0 -6
- scipplan/translation/temporal_constraints_navigation_3.txt +0 -7
- scipplan/translation/transitions_navigation_1.txt +0 -4
- scipplan/translation/transitions_navigation_2.txt +0 -4
- scipplan/translation/transitions_navigation_3.txt +0 -4
- scipplan-0.2.0a2.dist-info/METADATA +0 -217
- scipplan-0.2.0a2.dist-info/RECORD +0 -44
- scipplan-0.2.0a2.dist-info/top_level.txt +0 -1
- {scipplan-0.2.0a2.dist-info → scipplan-0.2.2a0.dist-info}/entry_points.txt +0 -0
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"
|
@@ -149,25 +204,15 @@ class ParseModel:
|
|
149
204
|
else:
|
150
205
|
aux_var: Variable = self.expressions.aux_vars[idx]
|
151
206
|
|
152
|
-
|
207
|
+
if self.params.add_aux_vars is True:
|
208
|
+
aux_vars.append(aux_var)
|
153
209
|
self.variables[aux_var.name] = aux_var.model_var
|
154
210
|
|
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))
|
161
|
-
|
162
|
-
expr.ops[0] = switch_comparator(expr.ops[0])
|
211
|
+
expr1, expr2 = linearise(expr, aux_var)
|
163
212
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
right=ast.parse(f"feastol - bigM").body[0].value
|
168
|
-
)
|
169
|
-
|
170
|
-
self.expressions.add_expressions(self.evaluate(expr))
|
213
|
+
self.expressions.add_expressions(self.evaluate(expr1))
|
214
|
+
self.expressions.add_expressions(self.evaluate(expr2))
|
215
|
+
|
171
216
|
else:
|
172
217
|
raise Exception("or expressions may only be made up of inequalities")
|
173
218
|
lhs = SumExpr()
|
@@ -236,4 +281,4 @@ if __name__ == "__main__":
|
|
236
281
|
# print(calc(
|
237
282
|
# """
|
238
283
|
# a + b + c >= 5 or a - b - c == 10
|
239
|
-
# """))
|
284
|
+
# """))
|
scipplan/plan_model.py
CHANGED
@@ -116,12 +116,17 @@ class PlanModel:
|
|
116
116
|
|
117
117
|
self.var_names.add(name)
|
118
118
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
119
|
+
if vtype.startswith("global"):
|
120
|
+
var = Variable.create_var(self.model, name, vtype, "global", self.constants)
|
121
|
+
for t in range(self.config.horizon + 1):
|
122
|
+
variables[(name, t)] = var
|
123
|
+
else:
|
124
|
+
for t in range(self.config.horizon):
|
125
|
+
variables[(name, t)] = Variable.create_var(self.model, name, vtype, t, self.constants)
|
126
|
+
var_type = variables[(name, t)].var_type
|
127
|
+
if var_type is VarType.STATE:
|
128
|
+
variables[(name, self.config.horizon)] = Variable.create_var(self.model, name, vtype, self.config.horizon, self.constants)
|
129
|
+
|
125
130
|
return variables
|
126
131
|
|
127
132
|
|
@@ -160,8 +165,6 @@ class PlanModel:
|
|
160
165
|
for cons_idx, (translation, constraints) in enumerate(translations.items()):
|
161
166
|
for idx, constraint in enumerate(constraints):
|
162
167
|
if (self.config.provide_sols is False) and (translation == "temporal_constraints"):
|
163
|
-
# for func_name, func in self.ode_functions.items():
|
164
|
-
# constraint = constraint.replace(func_name, func)
|
165
168
|
pattern = r"|".join(f"({func_name})" for func_name, func in self.ode_functions.items())
|
166
169
|
constraint = re.sub(pattern, lambda x: self.ode_functions[x.group(0)], constraint)
|
167
170
|
constraints[idx] = constraint
|
@@ -297,7 +300,7 @@ class PlanModel:
|
|
297
300
|
|
298
301
|
dt = Symbol(dt_var)
|
299
302
|
# Used to represent constant variables
|
300
|
-
temp_var = Symbol("
|
303
|
+
temp_var = Symbol("ODES_TEMP_VAR")
|
301
304
|
|
302
305
|
variables = {}
|
303
306
|
states = []
|
scipplan/scipplan.py
CHANGED
@@ -68,7 +68,8 @@ class SCIPPlan:
|
|
68
68
|
"zero_crossing_coefficient": zero_cross.coef,
|
69
69
|
"new_dt_val": zero_cross.new_dt_val,
|
70
70
|
"horizon": zero_cross.horizon,
|
71
|
-
"iteration": zero_cross.iteration
|
71
|
+
"iteration": zero_cross.iteration,
|
72
|
+
"constraint_idx": zero_cross.constraint_idx
|
72
73
|
})
|
73
74
|
|
74
75
|
if self.config.show_output is True:
|
@@ -80,19 +81,19 @@ class SCIPPlan:
|
|
80
81
|
|
81
82
|
self.scip_model.freeTransform()
|
82
83
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
84
|
+
t = zero_cross.horizon
|
85
|
+
idx = zero_cross.constraint_idx
|
86
|
+
constraint = self.plan.translations["temporal_constraints"][idx]
|
87
|
+
aux_vars = self.plan.aux_vars["temporal_constraints"][idx][t]
|
88
|
+
# Only add aux vars if there are no aux vars added for the specific constraint
|
89
|
+
params = self.plan.get_parser_params(horizon=t, add_aux_vars=aux_vars is None)
|
90
|
+
params.variables[self.config.dt_var] *= zero_cross.coef
|
91
|
+
exprs = PM(params).evaluate(constraint, aux_vars=aux_vars)
|
92
|
+
if const_gen_aux_vars[idx][t] is None:
|
93
|
+
const_gen_aux_vars[idx][t] = exprs.aux_vars
|
94
|
+
|
95
|
+
for eqtn_idx, eqtn in enumerate(exprs):
|
96
|
+
self.plan.model.addCons(eqtn, f"{constraint}_{idx}_{eqtn_idx}")
|
96
97
|
|
97
98
|
iteration += 1
|
98
99
|
|
@@ -104,7 +105,7 @@ class SCIPPlan:
|
|
104
105
|
for h in range(self.config.horizon):
|
105
106
|
dt = self.scip_model.getVal(self.plan.variables[(self.config.dt_var, h)].model_var)
|
106
107
|
|
107
|
-
for constraint in self.plan.translations["temporal_constraints"]:
|
108
|
+
for idx, constraint in enumerate(self.plan.translations["temporal_constraints"]):
|
108
109
|
is_violated = False
|
109
110
|
|
110
111
|
for time in iterate(0, dt, self.config.epsilon):
|
@@ -129,6 +130,7 @@ class SCIPPlan:
|
|
129
130
|
start=cross_interval[0],
|
130
131
|
end=cross_interval[1],
|
131
132
|
dt_interval=dt,
|
133
|
+
constraint_idx = idx,
|
132
134
|
)
|
133
135
|
|
134
136
|
return ZeroCrossing(is_violated=False)
|
@@ -213,4 +215,4 @@ def main():
|
|
213
215
|
print(f"Total time: {solve_time:.3f}")
|
214
216
|
|
215
217
|
if __name__ == "__main__":
|
216
|
-
main()
|
218
|
+
main()
|
scipplan/zero_crossing.py
CHANGED
@@ -11,6 +11,7 @@ class ZeroCrossing:
|
|
11
11
|
dt_interval: float = None
|
12
12
|
coef: float = field(init=False, default=None)
|
13
13
|
new_dt_val: float = field(init=False, default=None)
|
14
|
+
constraint_idx: int = None
|
14
15
|
|
15
16
|
def __post_init__(self):
|
16
17
|
if self.is_violated is True:
|
@@ -25,4 +26,4 @@ class ZeroCrossing:
|
|
25
26
|
"""))
|
26
27
|
avg_interval = (self.start + self.end) / 2.0
|
27
28
|
self.coef = avg_interval / self.dt_interval
|
28
|
-
self.new_dt_val = self.coef * self.dt_interval
|
29
|
+
self.new_dt_val = self.coef * self.dt_interval
|
@@ -0,0 +1,105 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: scipplan
|
3
|
+
Version: 0.2.2a0
|
4
|
+
Summary: Metric Hybrid Factored Planning in Nonlinear Domains with Constraint Generation in Python.
|
5
|
+
Author: Ari Gestetner, Buser Say
|
6
|
+
Author-email: ari.gestetner@monash.edu, buser.say@monash.edu
|
7
|
+
License: MIT License
|
8
|
+
Keywords: scip,automated planner
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
10
|
+
Classifier: Environment :: Console
|
11
|
+
Classifier: Intended Audience :: Science/Research
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
13
|
+
Classifier: Natural Language :: English
|
14
|
+
Classifier: Operating System :: OS Independent
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
16
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
17
|
+
Description-Content-Type: text/markdown
|
18
|
+
License-File: LICENSE
|
19
|
+
Requires-Dist: PySCIPOpt==5.2.1
|
20
|
+
Requires-Dist: sympy==1.13.3
|
21
|
+
|
22
|
+
# SCIPPlan
|
23
|
+
|
24
|
+
SCIPPlan [1,2,3] is a SCIP-based [4] hybrid planner for domains with i) mixed (i.e., real and/or discrete valued) state and action spaces, ii) nonlinear state transitions (which can be specified as ODEs or directly as solution equations) that are functions of time, and iii) general reward functions. SCIPPlan iteratively i) finds violated constraints (i.e., zero-crossings) by simulating the state transitions, and ii) adds the violated (symbolic) constraints back to its underlying optimisation model, until a valid plan is found.
|
25
|
+
|
26
|
+
## Example Domain: Navigation
|
27
|
+
|
28
|
+
<img src=./visualisation/scipplan_navigation_1.gif width="32%" height="32%"> <img src=./visualisation/scipplan_navigation_2.gif width="32%" height="32%"> <img src=./visualisation/scipplan_navigation_3.gif width="32%" height="32%">
|
29
|
+
|
30
|
+
|
31
|
+
Figure 1: Visualisation of different plans generated by SCIPPlan [1,2,3] for example navigation domains where the red square represents the agent, the blue shapes represent the obstacles, the gold star represents the goal location and the delta represents time. The agent can control its acceleration and the duration of its control input to modify its speed and location in order to navigate in a two-dimensional maze. The purpose of the domain is to find a path for the agent with minimum makespan such that the agent reaches its the goal without colliding with the obstacles.
|
32
|
+
|
33
|
+
Note that SCIPPlan does not linearise or discretise the domain to find a valid plan.
|
34
|
+
|
35
|
+
## Dependencies
|
36
|
+
|
37
|
+
i) Solver: SCIP (the current implementation uses the python interface to the SCIP solver, i.e., PySCIPOpt [5]). This version of SCIPPlan has only been tested on PySCIOpt>=4.0.0 using earlier an version of pyscipopt may result in unintended behaviour.
|
38
|
+
|
39
|
+
ii) Symbolic Mathematics: SymPy [6].
|
40
|
+
|
41
|
+
## Installing and Running SCIPPlan
|
42
|
+
In order to Install SCIPPlan you need to ensure you have a working version of the SCIP optimisation suite on your system which can be installed from [the SCIP website](https://www.scipopt.org). For more information about SCIP and PySCIPOpt refer to this [installation guide](https://github.com/scipopt/PySCIPOpt/blob/master/INSTALL.md).
|
43
|
+
|
44
|
+
After installing SCIP you will be able to install SCIPPlan using
|
45
|
+
```bash
|
46
|
+
pip install scipplan
|
47
|
+
```
|
48
|
+
Now you will be able to run some of the example domains which include
|
49
|
+
- Navigation (3 instances)
|
50
|
+
|
51
|
+
To run one of these examples all you need to do is run
|
52
|
+
```bash
|
53
|
+
scipplan -D navigation -I 1
|
54
|
+
```
|
55
|
+
which will run the 1st instance of the navigation domain using the ODEs as the transition function with the help of SymPy [6]. Similarly, the command
|
56
|
+
```bash
|
57
|
+
scipplan -D navigation -I 1 --provide-sols
|
58
|
+
```
|
59
|
+
will run the the 1st instance of the navigation domain using the solution equations as the transition function. For more information regarding the available tags and what they mean run `scipplan --help`.
|
60
|
+
|
61
|
+
Alternatively you can import scipplan classes to run it using python.
|
62
|
+
```py
|
63
|
+
from scipplan.scipplan import SCIPPlan
|
64
|
+
from scipplan.config import Config
|
65
|
+
from scipplan.helpers import write_to_csv
|
66
|
+
```
|
67
|
+
this will import the only two classes and function needed to run SCIPPlan. Then to set the configuration either create an instance of the Config class by setting the params or by retrieving the cli input
|
68
|
+
```py
|
69
|
+
# Set params
|
70
|
+
config = Config(domain="navigation", instance=1)
|
71
|
+
# Retrieve cli args
|
72
|
+
config = Config.get_config()
|
73
|
+
```
|
74
|
+
after which you are able to solve problem by either using the solve or optimize methods
|
75
|
+
```py
|
76
|
+
# The optimize method just optimises the problem for the given horizon
|
77
|
+
plan = SCIPPlan(config)
|
78
|
+
plan.optimize()
|
79
|
+
# Class method which takes input the config, solves the problem
|
80
|
+
# with auto incrementing the horizon until a solution is found then
|
81
|
+
# returns the plan as well as the time taken to solve the problem
|
82
|
+
plan, solve_time = SCIPPlan.solve(config)
|
83
|
+
```
|
84
|
+
In order to save the generated constraints for the horizon solved as well as the results, use the following code
|
85
|
+
```py
|
86
|
+
write_to_csv("new_constraints", plan.new_constraints, config)
|
87
|
+
write_to_csv("results", plan.results_table, config)
|
88
|
+
```
|
89
|
+
|
90
|
+
## Citation
|
91
|
+
|
92
|
+
If you are using SCIPPlan, please cite the papers [1,2,3] and the underlying SCIP solver [4].
|
93
|
+
|
94
|
+
## References
|
95
|
+
[1] Buser Say and Scott Sanner. [Metric Nonlinear Hybrid Planning with Constraint Generation](http://icaps18.icaps-conference.org/fileadmin/alg/conferences/icaps18/workshops/workshop06/docs/proceedings.pdf#page=23). In PlanSOpt, pages 19-25, 2018.
|
96
|
+
|
97
|
+
[2] Buser Say and Scott Sanner. [Metric Hybrid Factored Planning in Nonlinear Domains with Constraint Generation](https://link.springer.com/chapter/10.1007/978-3-030-19212-9_33). In CPAIOR, pages 502-518, 2019.
|
98
|
+
|
99
|
+
[3] Buser Say. [Robust Metric Hybrid Planning in Stochastic Nonlinear Domains Using Mathematical Optimization](https://ojs.aaai.org/index.php/ICAPS/article/view/27216). In ICAPS, pages 375-383, 2023.
|
100
|
+
|
101
|
+
[4] [SCIP](https://www.scipopt.org/)
|
102
|
+
|
103
|
+
[5] [PySCIPOpt](https://github.com/SCIP-Interfaces/PySCIPOpt)
|
104
|
+
|
105
|
+
[6] [SymPy](https://www.sympy.org/en/index.html)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
build/lib/scipplan/__init__.py,sha256=6tjLoCc3ID0D6ilf2H0cTgot-fHu_HzeXfo5MAyfYLc,196
|
2
|
+
build/lib/scipplan/config.py,sha256=Ojs_pdjhwRuANPJcGyb3m5mMGqbTZkHuNvppd_Wd4FQ,5615
|
3
|
+
build/lib/scipplan/helpers.py,sha256=YmS0HPQymsO5_e3jK7WQ-hBRZnxoZtewLhuzubw5sR4,975
|
4
|
+
build/lib/scipplan/parse_model.py,sha256=yGYGY0ZfBC8OPfX3i2kbyDKrsJ94duDm_RlxlbzNaZ4,11206
|
5
|
+
build/lib/scipplan/plan_model.py,sha256=Pz2RaYFcx1ZV6BQmr-ikUKAiQ8LqNhA0DPhdT8Ls6u8,14373
|
6
|
+
build/lib/scipplan/scipplan.py,sha256=aO4r0vaNWHgnZq1Pf9Y86t33OYBQD4O9pRAOZNR2ods,8724
|
7
|
+
build/lib/scipplan/variables.py,sha256=3sxY3zQuxsa5z2fTFjv4zOSb9GarzojZ4W4kIx9FX68,2561
|
8
|
+
build/lib/scipplan/zero_crossing.py,sha256=0auSm3-3993tyFVtq4gGeF4wScbkyGxfNw6pG2dsAvs,1075
|
9
|
+
scipplan/__init__.py,sha256=6tjLoCc3ID0D6ilf2H0cTgot-fHu_HzeXfo5MAyfYLc,196
|
10
|
+
scipplan/config.py,sha256=Ojs_pdjhwRuANPJcGyb3m5mMGqbTZkHuNvppd_Wd4FQ,5615
|
11
|
+
scipplan/helpers.py,sha256=YmS0HPQymsO5_e3jK7WQ-hBRZnxoZtewLhuzubw5sR4,975
|
12
|
+
scipplan/parse_model.py,sha256=yGYGY0ZfBC8OPfX3i2kbyDKrsJ94duDm_RlxlbzNaZ4,11206
|
13
|
+
scipplan/plan_model.py,sha256=Pz2RaYFcx1ZV6BQmr-ikUKAiQ8LqNhA0DPhdT8Ls6u8,14373
|
14
|
+
scipplan/scipplan.py,sha256=aO4r0vaNWHgnZq1Pf9Y86t33OYBQD4O9pRAOZNR2ods,8724
|
15
|
+
scipplan/variables.py,sha256=3sxY3zQuxsa5z2fTFjv4zOSb9GarzojZ4W4kIx9FX68,2561
|
16
|
+
scipplan/zero_crossing.py,sha256=0auSm3-3993tyFVtq4gGeF4wScbkyGxfNw6pG2dsAvs,1075
|
17
|
+
scipplan/translation/odes_navigation_1.txt,sha256=Uv13eTSTvURb6TtY7rq-otlpJMS8cQDYSyaO3X2_SRs,1015
|
18
|
+
scipplan/translation/odes_navigation_2.txt,sha256=DcbpXv-q0NP8Tx10YKqD6425esblgPNlTxchkyWMJAc,1192
|
19
|
+
scipplan/translation/odes_navigation_3.txt,sha256=ZFTyFEiL1KP0yxOCOzOSoXz9dXulRmtXDBnfZqaVbaE,1370
|
20
|
+
scipplan/translation/solutions_navigation_1.txt,sha256=5iLPRtJXqfAXi0QG-3WPtKn8t0pH4-E2AtNp8-7k1CQ,1542
|
21
|
+
scipplan/translation/solutions_navigation_2.txt,sha256=b1c74m54iRCcZoe8uqquUQyn6HtRTiFqIA8ss2mZUdg,1895
|
22
|
+
scipplan/translation/solutions_navigation_3.txt,sha256=Jv3bzMt84LVyR1DSVJ5B8Ky9id_khZ1PxZ1s3QPKpk8,2249
|
23
|
+
scipplan-0.2.2a0.dist-info/LICENSE,sha256=KLZVolgtGLnK2b-INKXXO7wOneDlgmIUP6WC4R5wRC4,1053
|
24
|
+
scipplan-0.2.2a0.dist-info/METADATA,sha256=-UKhTY5lscjt3a_VpgcSOM2cx89cZTMO-Ys_K6L6QgU,5818
|
25
|
+
scipplan-0.2.2a0.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
|
26
|
+
scipplan-0.2.2a0.dist-info/entry_points.txt,sha256=3qiNbbp6qIwivyPmmikyp7ByCfmsa9rGFNJPcN9Is8I,52
|
27
|
+
scipplan-0.2.2a0.dist-info/top_level.txt,sha256=zE5zfBzLJlVjWUD5VuiQ5YPY7HtvU7uuw9hHKX9XaMo,41
|
28
|
+
scipplan-0.2.2a0.dist-info/RECORD,,
|
@@ -1 +0,0 @@
|
|
1
|
-
Epsilon = config_epsilon
|
@@ -1,10 +0,0 @@
|
|
1
|
-
Location_x <= 10.0
|
2
|
-
Location_y <= 10.0
|
3
|
-
Location_x >= 0.0
|
4
|
-
Location_y >= 0.0
|
5
|
-
Accelerate_x <= 0.5
|
6
|
-
Accelerate_y <= 0.5
|
7
|
-
Accelerate_x >= -0.5
|
8
|
-
Accelerate_y >= -0.5
|
9
|
-
(Location_x <= 2.0) or (Location_x >= 4.0) or (Location_y <= 1.0) or (Location_y >= 5.0)
|
10
|
-
(Location_x <= 5.0) or (Location_x >= 7.0) or (Location_y <= 5.0) or (Location_y >= 9.0)
|
@@ -1,11 +0,0 @@
|
|
1
|
-
Location_x <= 10.0
|
2
|
-
Location_y <= 10.0
|
3
|
-
Location_x >= 0.0
|
4
|
-
Location_y >= 0.0
|
5
|
-
Accelerate_x <= 0.5
|
6
|
-
Accelerate_y <= 0.5
|
7
|
-
Accelerate_x >= -0.5
|
8
|
-
Accelerate_y >= -0.5
|
9
|
-
(Location_x <= 2.0) or (Location_x >= 4.0) or (Location_y <= 1.0) or (Location_y >= 9.0)
|
10
|
-
(Location_x <= 4.0) or (Location_x >= 7.0) or (Location_y <= 7.0) or (Location_y >= 9.0)
|
11
|
-
(Location_x <= 4.0) or (Location_x >= 9.0) or (Location_y <= 2.0) or (Location_y >= 6.0)
|
@@ -1 +0,0 @@
|
|
1
|
-
-1.0*(Dt + Mode * Epsilon)
|
@@ -1 +0,0 @@
|
|
1
|
-
-1.0*(Dt + Epsilon * Mode)
|
@@ -1 +0,0 @@
|
|
1
|
-
-1.0*(Dt+Epsilon*Mode)
|
@@ -1,6 +0,0 @@
|
|
1
|
-
Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 10.0
|
2
|
-
Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 10.0
|
3
|
-
Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 0.0
|
4
|
-
Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 0.0
|
5
|
-
|
6
|
-
(Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 4.0) or (Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 6.0) or (Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 4.0) or (Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 6.0)
|
@@ -1,6 +0,0 @@
|
|
1
|
-
Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 10.0
|
2
|
-
Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 10.0
|
3
|
-
Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 0.0
|
4
|
-
Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 0.0
|
5
|
-
(Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 2.0) or (Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 4.0) or (Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 1.0) or (Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 5.0)
|
6
|
-
(Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 5.0) or (Location_x + Speed_x*(Dt + Epsilon*Mode) + 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 7.0) or (Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) <= 5.0) or (Location_y + Speed_y*(Dt + Epsilon*Mode) + 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) >= 9.0)
|
@@ -1,7 +0,0 @@
|
|
1
|
-
Location_x + Speed_x*(Dt+Epsilon*Mode) + 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) <= 10.0
|
2
|
-
Location_y + Speed_y*(Dt+Epsilon*Mode) + 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) <= 10.0
|
3
|
-
Location_x + Speed_x*(Dt+Epsilon*Mode) + 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) >= 0.0
|
4
|
-
Location_y + Speed_y*(Dt+Epsilon*Mode) + 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) >= 0.0
|
5
|
-
(Location_x + Speed_x*(Dt+Epsilon*Mode) + 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) <= 2.0) or (Location_x + Speed_x*(Dt+Epsilon*Mode) + 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) >= 4.0) or (Location_y + Speed_y*(Dt+Epsilon*Mode) + 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) <= 1.0) or (Location_y + Speed_y*(Dt+Epsilon*Mode) + 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) >= 9.0)
|
6
|
-
(Location_x + Speed_x*(Dt+Epsilon*Mode) + 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) <= 4.0) or (Location_x + Speed_x*(Dt+Epsilon*Mode) + 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) >= 7.0) or (Location_y + Speed_y*(Dt+Epsilon*Mode) + 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) <= 7.0) or (Location_y + Speed_y*(Dt+Epsilon*Mode) + 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) >= 9.0)
|
7
|
-
(Location_x + Speed_x*(Dt+Epsilon*Mode) + 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) <= 4.0) or (Location_x + Speed_x*(Dt+Epsilon*Mode) + 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) >= 9.0) or (Location_y + Speed_y*(Dt+Epsilon*Mode) + 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) <= 2.0) or (Location_y + Speed_y*(Dt+Epsilon*Mode) + 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) >= 6.0)
|
@@ -1,4 +0,0 @@
|
|
1
|
-
Location_x_dash - 1.0*Location_x - 1.0*Speed_x*(Dt + Epsilon*Mode) - 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) == 0.0
|
2
|
-
Location_y_dash - 1.0*Location_y - 1.0*Speed_y*(Dt + Epsilon*Mode) - 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) == 0.0
|
3
|
-
Speed_x_dash - 1.0*Speed_x - 1.0*Accelerate_x*(Dt + Epsilon*Mode) == 0.0
|
4
|
-
Speed_y_dash - 1.0*Speed_y - 1.0*Accelerate_y*(Dt + Epsilon*Mode) == 0.0
|
@@ -1,4 +0,0 @@
|
|
1
|
-
Location_x_dash - 1.0*Location_x - 1.0*Speed_x*(Dt + Epsilon*Mode) - 0.5*Accelerate_x*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) == 0.0
|
2
|
-
Location_y_dash - 1.0*Location_y - 1.0*Speed_y*(Dt + Epsilon*Mode) - 0.5*Accelerate_y*(Dt + Epsilon*Mode)*(Dt + Epsilon*Mode) == 0.0
|
3
|
-
Speed_x_dash - 1.0*Speed_x - 1.0*Accelerate_x*(Dt + Epsilon*Mode) == 0.0
|
4
|
-
Speed_y_dash - 1.0*Speed_y - 1.0*Accelerate_y*(Dt + Epsilon*Mode) == 0.0
|
@@ -1,4 +0,0 @@
|
|
1
|
-
Location_x_dash - 1.0*Location_x - 1.0*Speed_x*(Dt+Epsilon*Mode) - 0.5*Accelerate_x*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) == 0.0
|
2
|
-
Location_y_dash - 1.0*Location_y - 1.0*Speed_y*(Dt+Epsilon*Mode) - 0.5*Accelerate_y*(Dt+Epsilon*Mode)*(Dt+Epsilon*Mode) == 0.0
|
3
|
-
Speed_x_dash - 1.0*Speed_x - 1.0*Accelerate_x*(Dt+Epsilon*Mode) == 0.0
|
4
|
-
Speed_y_dash - 1.0*Speed_y - 1.0*Accelerate_y*(Dt+Epsilon*Mode) == 0.0
|