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.
Files changed (46) hide show
  1. build/lib/scipplan/__init__.py +5 -0
  2. build/lib/scipplan/config.py +163 -0
  3. build/lib/scipplan/helpers.py +31 -0
  4. build/lib/scipplan/parse_model.py +284 -0
  5. build/lib/scipplan/plan_model.py +339 -0
  6. build/lib/scipplan/scipplan.py +218 -0
  7. build/lib/scipplan/variables.py +91 -0
  8. build/lib/scipplan/zero_crossing.py +29 -0
  9. scipplan/__init__.py +3 -3
  10. scipplan/parse_model.py +71 -26
  11. scipplan/plan_model.py +12 -9
  12. scipplan/scipplan.py +18 -16
  13. scipplan/zero_crossing.py +2 -1
  14. {scipplan-0.2.0a2.dist-info → scipplan-0.2.2a0.dist-info}/LICENSE +1 -1
  15. scipplan-0.2.2a0.dist-info/METADATA +105 -0
  16. scipplan-0.2.2a0.dist-info/RECORD +28 -0
  17. {scipplan-0.2.0a2.dist-info → scipplan-0.2.2a0.dist-info}/WHEEL +1 -1
  18. scipplan-0.2.2a0.dist-info/top_level.txt +5 -0
  19. scipplan/translation/constants_navigation_1.txt +0 -2
  20. scipplan/translation/constants_navigation_2.txt +0 -2
  21. scipplan/translation/constants_navigation_3.txt +0 -1
  22. scipplan/translation/goals_navigation_1.txt +0 -2
  23. scipplan/translation/goals_navigation_2.txt +0 -2
  24. scipplan/translation/goals_navigation_3.txt +0 -2
  25. scipplan/translation/initials_navigation_1.txt +0 -4
  26. scipplan/translation/initials_navigation_2.txt +0 -4
  27. scipplan/translation/initials_navigation_3.txt +0 -4
  28. scipplan/translation/instantaneous_constraints_navigation_1.txt +0 -9
  29. scipplan/translation/instantaneous_constraints_navigation_2.txt +0 -10
  30. scipplan/translation/instantaneous_constraints_navigation_3.txt +0 -11
  31. scipplan/translation/pvariables_navigation_1.txt +0 -8
  32. scipplan/translation/pvariables_navigation_2.txt +0 -8
  33. scipplan/translation/pvariables_navigation_3.txt +0 -8
  34. scipplan/translation/reward_navigation_1.txt +0 -1
  35. scipplan/translation/reward_navigation_2.txt +0 -1
  36. scipplan/translation/reward_navigation_3.txt +0 -1
  37. scipplan/translation/temporal_constraints_navigation_1.txt +0 -6
  38. scipplan/translation/temporal_constraints_navigation_2.txt +0 -6
  39. scipplan/translation/temporal_constraints_navigation_3.txt +0 -7
  40. scipplan/translation/transitions_navigation_1.txt +0 -4
  41. scipplan/translation/transitions_navigation_2.txt +0 -4
  42. scipplan/translation/transitions_navigation_3.txt +0 -4
  43. scipplan-0.2.0a2.dist-info/METADATA +0 -217
  44. scipplan-0.2.0a2.dist-info/RECORD +0 -44
  45. scipplan-0.2.0a2.dist-info/top_level.txt +0 -1
  46. {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
- def switch_comparator(comparator):
14
- if isinstance(comparator, ast.Eq): return ast.NotEq()
15
- if isinstance(comparator, ast.NotEq): return ast.Eq()
16
- if isinstance(comparator, ast.Lt): return ast.Gt()
17
- if isinstance(comparator, ast.LtE): return ast.GtE()
18
- if isinstance(comparator, ast.Gt): return ast.Lt()
19
- if isinstance(comparator, ast.GtE): return ast.LtE()
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
- "enum type CALCULATOR: Used to calculate using feastol
41
- "enum type PARSER: Used to parse an expression and create the correct minlp constraints
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
- aux_vars.append(aux_var)
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
- expr.left = ast.BinOp(
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
- expr.comparators[0] = ast.BinOp(
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))
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
- for t in range(self.config.horizon):
120
- variables[(name, t)] = Variable.create_var(self.model, name, vtype, t, self.constants)
121
- var_type = variables[(name, t)].var_type
122
- if var_type is VarType.STATE:
123
- variables[(name, self.config.horizon)] = Variable.create_var(self.model, name, vtype, self.config.horizon, self.constants)
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("TEMP_VAR")
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
- for idx, constraint in enumerate(self.plan.translations["temporal_constraints"]):
84
- t = zero_cross.horizon
85
- # aux_vars = self.plan.aux_vars["temporal_constraints"][idx][t]
86
- aux_vars = const_gen_aux_vars[idx][t]
87
- # Only add aux vars if there are no aux vars added for the secific constraint
88
- params = self.plan.get_parser_params(horizon=t, add_aux_vars=aux_vars is None)
89
- params.variables[self.config.dt_var] *= zero_cross.coef
90
- exprs = PM(params).evaluate(constraint, aux_vars=aux_vars)
91
- if const_gen_aux_vars[idx][t] is None:
92
- const_gen_aux_vars[idx][t] = exprs.aux_vars
93
-
94
- for eqtn_idx, eqtn in enumerate(exprs):
95
- self.plan.model.addCons(eqtn, f"{constraint}_{idx}_{eqtn_idx}")
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
@@ -1,4 +1,4 @@
1
- Copyright (c) 2024 Ari Gestetner
1
+ Copyright (c) 2025 Buser Say
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
@@ -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,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.45.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
@@ -0,0 +1,5 @@
1
+ build
2
+ dist
3
+ output
4
+ scipplan
5
+ visualisation
@@ -1,2 +0,0 @@
1
- Epsilon = config_epsilon
2
- bigM = config_bigM
@@ -1,2 +0,0 @@
1
- bigM = config_bigM
2
- Epsilon = config_epsilon
@@ -1 +0,0 @@
1
- Epsilon = config_epsilon
@@ -1,2 +0,0 @@
1
- Location_x == 8.0
2
- Location_y == 8.0
@@ -1,2 +0,0 @@
1
- Location_x == 8.0
2
- Location_y == 8.0
@@ -1,2 +0,0 @@
1
- Location_x == 8.0
2
- Location_y == 8.0
@@ -1,4 +0,0 @@
1
- Location_x == 0.0
2
- Location_y == 0.0
3
- Speed_x == 0.0
4
- Speed_y == 0.0
@@ -1,4 +0,0 @@
1
- Location_x == 0.0
2
- Location_y == 0.0
3
- Speed_x == 0.0
4
- Speed_y == 0.0
@@ -1,4 +0,0 @@
1
- Location_x == 0.0
2
- Location_y == 0.0
3
- Speed_x == 0.0
4
- Speed_y == 0.0
@@ -1,9 +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 <= 4.0) or (Location_x >= 6.0) or (Location_y <= 4.0) or (Location_y >= 6.0)
@@ -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,8 +0,0 @@
1
- action_continuous: Accelerate_x
2
- action_continuous: Accelerate_y
3
- action_continuous: Dt
4
- action_boolean: Mode
5
- state_continuous: Location_x
6
- state_continuous: Location_y
7
- state_continuous: Speed_x
8
- state_continuous: Speed_y
@@ -1,8 +0,0 @@
1
- action_continuous: Accelerate_x
2
- action_continuous: Accelerate_y
3
- action_continuous: Dt
4
- state_continuous: Location_x
5
- state_continuous: Location_y
6
- state_continuous: Speed_x
7
- state_continuous: Speed_y
8
- action_boolean: Mode
@@ -1,8 +0,0 @@
1
- action_continuous: Accelerate_x
2
- action_continuous: Accelerate_y
3
- action_boolean: Mode
4
- action_continuous: Dt
5
- state_continuous: Location_x
6
- state_continuous: Location_y
7
- state_continuous: Speed_x
8
- state_continuous: Speed_y
@@ -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