umaudemc 0.12.2__py3-none-any.whl → 0.13.1__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.
umaudemc/simulators.py CHANGED
@@ -79,8 +79,9 @@ class BaseSimulator:
79
79
  if not t:
80
80
  t, var = parse_hole_term(self.module, observation)
81
81
  self.obs_cache[observation] = (t, var)
82
- subs = maude.Substitution({var: self.state})
83
- t = subs.instantiate(t)
82
+ if var is not None:
83
+ subs = maude.Substitution({var: self.state})
84
+ t = subs.instantiate(t)
84
85
  t.reduce()
85
86
 
86
87
  return float(t == self.true) if t.getSort() == self.bool_sort else float(t)
umaudemc/statistical.py CHANGED
@@ -221,6 +221,7 @@ def thread_main(program, qdata, simulator, num_sims, block_size, seed, queue, ba
221
221
  def run_parallel(program, qdata, num_sims, max_sim, simulator, alpha, delta, block_size, jobs, verbose=False):
222
222
  """Run the simulation in multiple threads"""
223
223
  import multiprocessing as mp
224
+ mp.set_start_method('fork', force=True)
224
225
 
225
226
  # When the number of jobs is zero or negative, we take the CPU count
226
227
  if jobs <= 0:
umaudemc/webui.py CHANGED
@@ -2,7 +2,6 @@
2
2
  # Web-based user interface
3
3
  #
4
4
 
5
- import cgi
6
5
  import http.server
7
6
  import json
8
7
  import math
@@ -156,10 +155,10 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
156
155
  """Object charged of handling the requests"""
157
156
 
158
157
  STATIC_FILES = {
159
- '/' : ('select.htm', 'text/html; charset=utf-8'),
160
- '/smcview.css' : ('smcview.css', 'text/css; charset=utf-8'),
161
- '/smcview.js' : ('smcview.js', 'text/javascript; charset=utf-8'),
162
- '/smcgraph.js' : ('smcgraph.js', 'text/javascript; charset=utf-8'),
158
+ '/' : ('select.htm', 'text/html; charset=utf-8'),
159
+ '/smcview.css' : ('smcview.css', 'text/css; charset=utf-8'),
160
+ '/smcview.js' : ('smcview.js', 'text/javascript; charset=utf-8'),
161
+ '/smcgraph.js' : ('smcgraph.js', 'text/javascript; charset=utf-8'),
163
162
  }
164
163
 
165
164
  def do_GET(self):
@@ -176,12 +175,11 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
176
175
  self.send_error(404)
177
176
 
178
177
  def do_POST(self):
179
- form = cgi.FieldStorage(fp=self.rfile, headers=self.headers,
180
- environ={'REQUEST_METHOD': 'POST',
181
- 'CONTENT_TYPE': self.headers['Content-Type']})
178
+ # Read the JSON body of the request
179
+ form = json.loads(self.rfile.read(int(self.headers['Content-Length'])))
182
180
 
183
- question = form.getvalue('question')
184
- url = form.getvalue('url', None)
181
+ question = form.get('question')
182
+ url = form.get('url', None)
185
183
 
186
184
  if question == 'ls':
187
185
  base, parent, dirs, files = self.server.info.path_handler.browse_dir(url)
@@ -194,10 +192,10 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
194
192
  self.end_headers()
195
193
 
196
194
  response = {
197
- 'base' : base,
198
- 'parent' : parent,
199
- 'dirs' : dirs,
200
- 'files' : files
195
+ 'base' : base,
196
+ 'parent' : parent,
197
+ 'dirs' : dirs,
198
+ 'files' : files
201
199
  }
202
200
  self.wfile.write(json.dumps(response).encode('utf-8'))
203
201
  elif question == 'sourceinfo':
@@ -217,16 +215,16 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
217
215
  self.send_response(200)
218
216
  self.send_header('Content-Type', 'text/json; charset=utf-8')
219
217
  self.end_headers()
220
- mod = form.getvalue('mod')
218
+ mod = form.get('mod')
221
219
  minfo = self.server.info.remote.getModuleInfo(mod)
222
220
  response = {
223
- 'name' : mod,
224
- 'type' : minfo['type'],
225
- 'params' : [],
226
- 'valid' : minfo['valid'],
227
- 'stateSorts' : minfo.get('state', []),
228
- 'strategies' : [self.make_signature(signat) for signat in minfo.get('strat', ())],
229
- 'props' : [self.make_signature(signat) for signat in minfo.get('prop', ())]
221
+ 'name' : mod,
222
+ 'type' : minfo['type'],
223
+ 'params' : [],
224
+ 'valid' : minfo['valid'],
225
+ 'stateSorts' : minfo.get('state', []),
226
+ 'strategies' : [self.make_signature(signat) for signat in minfo.get('strat', ())],
227
+ 'props' : [self.make_signature(signat) for signat in minfo.get('prop', ())]
230
228
  }
231
229
  self.wfile.write(json.dumps(response).encode('utf-8'))
232
230
  elif question == 'modelcheck':
@@ -234,13 +232,13 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
234
232
  self.send_header('Content-Type', 'text/json; charset=utf-8')
235
233
  self.end_headers()
236
234
  data = {
237
- 'module': form.getvalue('mod'),
238
- 'initial': form.getvalue('initial'),
239
- 'formula': form.getvalue('formula'),
240
- 'strat': form.getvalue('strategy'),
241
- 'opaques': form.getvalue('opaques'),
242
- 'passign': self.make_passign(form),
243
- 'reward': form.getvalue('reward', None),
235
+ 'module' : form.get('mod'),
236
+ 'initial' : form.get('initial'),
237
+ 'formula' : form.get('formula'),
238
+ 'strat' : form.get('strategy'),
239
+ 'opaques' : form.get('opaques'),
240
+ 'passign' : self.make_passign(form),
241
+ 'reward' : form.get('reward', None),
244
242
  }
245
243
  result = self.server.info.remote.modelCheck(data)
246
244
  response = {
@@ -267,7 +265,7 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
267
265
 
268
266
  self.wfile.write(json.dumps(response).encode('utf-8'))
269
267
  elif question == 'wait':
270
- mcref = int(form.getvalue('mcref'))
268
+ mcref = int(form.get('mcref'))
271
269
 
272
270
  # Model checking is actually done here
273
271
  result = self.server.info.remote.get_result(mcref)
@@ -327,16 +325,16 @@ class RequestHandler(http.server.BaseHTTPRequestHandler):
327
325
  def make_passign(form):
328
326
  """Build a passign term from its name and argument"""
329
327
 
330
- name = form.getvalue('pmethod', None)
328
+ name = form.get('pmethod', None)
331
329
 
332
330
  if name is None:
333
331
  return None
334
332
 
335
- argument = form.getvalue('pargument', '')
333
+ argument = form.get('pargument', '')
336
334
 
337
335
  # Add mdp- prefix when MDP is selected and admissible
338
336
  can_mdp = name not in ('uaction', 'strategy')
339
- mdp = 'mdp-' if can_mdp and form.getvalue('mdp') == 'true' else ''
337
+ mdp = 'mdp-' if can_mdp and form.get('mdp') == 'true' else ''
340
338
 
341
339
  return f'{mdp}{name}({argument})' if argument else f'{mdp}{name}'
342
340
 
umaudemc/wrappers.py CHANGED
@@ -11,6 +11,8 @@ from .common import maude, default_model_settings
11
11
 
12
12
 
13
13
  def default_getNextStates(self, stateNr):
14
+ """Generator of all the successors of a state"""
15
+
14
16
  index = 0
15
17
  next_state = self.getNextState(stateNr, index)
16
18
 
@@ -20,10 +22,38 @@ def default_getNextStates(self, stateNr):
20
22
  next_state = self.getNextState(stateNr, index)
21
23
 
22
24
 
25
+ def standard_getTransitions(self, stateNr):
26
+ """Generator of all the transitions (target state and rule) of a rewrite graph"""
27
+
28
+ index = 0
29
+ next_state = self.getNextState(stateNr, index)
30
+
31
+ while next_state != -1:
32
+ yield next_state, self.getRule(stateNr, next_state)
33
+ index = index + 1
34
+ next_state = self.getNextState(stateNr, index)
35
+
36
+
37
+ def strategy_getTransitions(self, stateNr):
38
+ """Generator of all the transitions of a strategy-controlled rewrite graph"""
39
+
40
+ index = 0
41
+ next_state = self.getNextState(stateNr, index)
42
+
43
+ while next_state != -1:
44
+ yield next_state, self.getTransition(stateNr, next_state)
45
+ index = index + 1
46
+ next_state = self.getNextState(stateNr, index)
47
+
48
+
23
49
  # Add getNextStates to the original graphs
24
50
  maude.RewriteGraph.getNextStates = default_getNextStates
25
51
  maude.StrategyRewriteGraph.getNextStates = default_getNextStates
26
52
 
53
+ # Add getTransitions to the original graphs
54
+ maude.RewriteGraph.getTransitions = standard_getTransitions
55
+ maude.StrategyRewriteGraph.getTransitions = strategy_getTransitions
56
+
27
57
  # Add a property to know whether the graph is strategy-controlled
28
58
  maude.RewriteGraph.strategyControlled = False
29
59
  maude.StrategyRewriteGraph.strategyControlled = True
@@ -50,6 +80,9 @@ class WrappedGraph:
50
80
  def getTransition(self, *args):
51
81
  return self.graph.getTransition(*args)
52
82
 
83
+ def getTransitions(self, stateNr):
84
+ return self.graph.getTransitions(stateNr)
85
+
53
86
  def getNrStates(self):
54
87
  return self.graph.getNrStates()
55
88
 
@@ -113,6 +146,11 @@ class FailFreeGraph(WrappedGraph):
113
146
  if self.valid_states[next_state]:
114
147
  yield next_state
115
148
 
149
+ def getTransitions(self, stateNr):
150
+ for next_state, edge in self.graph.getTransitions(stateNr):
151
+ if self.valid_states[next_state]:
152
+ yield next_state, edge
153
+
116
154
 
117
155
  class MergedGraph:
118
156
  """A graph where states are merged"""
@@ -141,6 +179,10 @@ class MergedGraph:
141
179
  return trans
142
180
  return None
143
181
 
182
+ def getTransitions(self, stateNr):
183
+ for next_state in self.getNextStates(stateNr):
184
+ yield next_state, self.getTransition(stateNr, next_state)
185
+
144
186
  def getNrStates(self):
145
187
  return len(self.states)
146
188
 
@@ -252,7 +294,7 @@ class BoundedGraph(WrappedGraph):
252
294
  yield next_state
253
295
 
254
296
 
255
- def wrapGraph(graph, purge_fails, merge_states):
297
+ def wrap_graph(graph, purge_fails, merge_states):
256
298
  """Wrap graphs according to the model modification options"""
257
299
  if purge_fails == 'yes':
258
300
  graph = FailFreeGraph(graph)
@@ -277,4 +319,4 @@ def create_graph(term=None, strategy=None, opaque=(), full_matchrew=False, purge
277
319
  # Wrap the graph with the model modification for branching-time
278
320
  purge_fails, merge_states = default_model_settings(logic, purge_fails, merge_states, strategy,
279
321
  tableau=tableau)
280
- return wrapGraph(graph, purge_fails, merge_states)
322
+ return wrap_graph(graph, purge_fails, merge_states)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: umaudemc
3
- Version: 0.12.2
3
+ Version: 0.13.1
4
4
  Summary: Unified Maude model-checking utility
5
5
  Author-email: ningit <ningit@users.noreply.github.com>
6
6
  License: GPLv3
@@ -1,29 +1,30 @@
1
- umaudemc/__init__.py,sha256=KzYlv9mV5BAclb_b4mb6NprSS8L9Xd0qsNzjQFwnp30,23
2
- umaudemc/__main__.py,sha256=KsbrKvz4NZdZqgzMwPGtZRGVNlyhGcYIB8PawpB_8uA,13892
3
- umaudemc/api.py,sha256=dgpq4gfYQ6eCoaI5ChHGAeibbsXYItLO1nUuB5qkssk,19732
1
+ umaudemc/__init__.py,sha256=pMjW1X1oCiVe0NrTCY4GkT0Wt53V0JJzr08mFS8RKk8,23
2
+ umaudemc/__main__.py,sha256=PBIa2mStJwNIK5YnwoCefEB_a59VLkHE_Zp_1hnMyg4,14060
3
+ umaudemc/api.py,sha256=I-o5foy8NUlO4JT4pX9L7kkuHQG_8_GMkWlOKt708E8,19733
4
4
  umaudemc/backends.py,sha256=mzJkALYwcKPInT0lBiRsCxJSewKvx5j_akQsqWN1Ezo,4590
5
- umaudemc/common.py,sha256=oEEjXfdytVnfoq60N1iayjiAfHS6C4L4d_RKJl8Q3rw,6032
6
- umaudemc/counterprint.py,sha256=WCPiEKXXWXKzALjz7onsbt74_L3OUnk2iWCI_tTHoDM,9114
7
- umaudemc/formatter.py,sha256=jZbrDUr6fnJiVG9hRCU63rvdLk9TnHs22Tw1R3M5HbU,6560
5
+ umaudemc/common.py,sha256=5jtR_HLZmTDrZFU2Isd3tJudZdMD-RbkiuHMUA3wPiE,4922
6
+ umaudemc/counterprint.py,sha256=vVqM_UjGRk_xeftFxBGI5m6cQXV7mf8KvbQ_fvAvSQk,9226
7
+ umaudemc/formatter.py,sha256=36l0nc9IIe4B0_eW_PPfDTIxJj0mHKZfddCUugrEyjM,6024
8
8
  umaudemc/formulae.py,sha256=jZPPDhjgsb7cs5rWvitiQoO0fd8JIlK98at2SN-LzVE,12156
9
- umaudemc/grapher.py,sha256=mUQjf48Rv0Ej0j6TIozVHfq2Np__j_KbEnygs1n_fbQ,4291
10
- umaudemc/gtk.py,sha256=WyAvI4ovXatKxJuKyAcJ36o2py5-thMAzSh-CfdT8Gg,17883
9
+ umaudemc/grapher.py,sha256=K1chKNNlEzQvfOsiFmRPJmd9OpxRIrg6OyiMW6gqOCU,4348
10
+ umaudemc/gtk.py,sha256=61p4_OSFDfNHFD4lLz3QTZ7yZBra3RINmgbcnB-mUis,4249
11
11
  umaudemc/jani.py,sha256=N5tE28jZC_OsI041nXOn02THlokpweATtEK-nx9pfWE,4130
12
+ umaudemc/kleene.py,sha256=Yxo9O2rjJNpS6y4Qfb_SP71tDrryV0KKUfmBIKXypwg,4458
12
13
  umaudemc/mproc.py,sha256=9X5pTb3Z3XHcdOo8ynH7I5RZQpjzm9xr4IBbEtaglUE,11766
13
- umaudemc/opsem.py,sha256=ICIzlAb6ubwpKbOVM8Un23LZ5ZW2DDr7euapwM1axMY,9451
14
- umaudemc/probabilistic.py,sha256=muyRxvmiMUw8GWkmm3mCPa0OJ6DUbbuCDE69BrsIYy0,29211
15
- umaudemc/pyslang.py,sha256=UnQwHov_2-mq-G0DN8N5TEd220rzG6uVWxbmDsFz2lE,81128
14
+ umaudemc/opsem.py,sha256=p49k8Dto0zJ7jeI8Ih5Q9bB4lqMQaF39kxprlvCMN3U,9448
15
+ umaudemc/probabilistic.py,sha256=f1ZtV84mAuaaGSmYCpun8gaUi5PFGCPD96BUgYvvBGk,29304
16
+ umaudemc/pyslang.py,sha256=m501iqJb4fVlIimpOy_tO7woK5QLkTWYav0no7onoXM,85099
16
17
  umaudemc/quatex.py,sha256=HQoiC8N7WnloHPBgNlcpWUi0NcIyUXm3IK_glfHbu4A,21611
17
18
  umaudemc/resources.py,sha256=k1sekrTafAcOb7GQN-mx2BgCBEBPUi-IR_4EjNjRRmU,1530
18
- umaudemc/simulators.py,sha256=gjCWR-TiPeOv65viH-djAkazqaLV0olwfbU6Nak2rdE,13205
19
- umaudemc/statistical.py,sha256=Az7r4uuB1XrO4akBiYu2th7DSPGzDDAacu6W5wJym-Q,9015
19
+ umaudemc/simulators.py,sha256=84W30MWWe4QRxK24RGA0zuwXjPya4wH18PrhPKdOpyU,13229
20
+ umaudemc/statistical.py,sha256=g5tfSzRWzKWivP793dxXuUJ1ftRrJKlSi27qvPPMxZs,9056
20
21
  umaudemc/terminal.py,sha256=B4GWLyW4Sdymgoavj418y4TI4MnWqNu3JS4BBoSYeTc,1037
21
22
  umaudemc/usermsgs.py,sha256=d3RfyBGEBmcV_c2MeXWCtZIiiM2vFnaHsN3MHwMnyAs,583
22
- umaudemc/webui.py,sha256=OQNqCigp1KepgLk-K4JX6TXEcKLWRzDaqTtvQiZTXaI,11196
23
- umaudemc/wrappers.py,sha256=8auVvHxdJdBgdMaMWCerdtJ-OurHYrFUWNR0XxJkA9g,8104
23
+ umaudemc/webui.py,sha256=7dWf5VVl5dGN9oBVTT8m6F4v_QqEbsKSH67q5FljuT8,11071
24
+ umaudemc/wrappers.py,sha256=uz9JV1zBVqzkuoByUd569fEcSxT_00aCJw-jcDtrFpE,9399
24
25
  umaudemc/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
26
  umaudemc/backend/_pymc.py,sha256=asfN3uc0PbizVTiBt0Hs1n7jxzUN629Baj90z5X8Gjc,6679
26
- umaudemc/backend/_spot.py,sha256=aLj--3xBbYYOF7vkch0n2RFPUm-R49LFQUIy2O6P2nQ,9346
27
+ umaudemc/backend/_spot.py,sha256=rwnXJG98kLsjjobeYdFh5RqK07al0bGMzjz2gLnUPOQ,9166
27
28
  umaudemc/backend/_storm.py,sha256=yhHPNxLOekr9ZdzZv5Jzv1K6R5hIrYKQ4SES0rds_0A,4675
28
29
  umaudemc/backend/_stormpy.py,sha256=KPbRkVYZhwlL007GfbJJc2VBHbBz3_UKqUNM0FV7PyU,8280
29
30
  umaudemc/backend/bmcalc.py,sha256=fE6RxIETYu-ywzrwRvWJP5ZZbZXuUbO6TdV4bcJjA6E,17502
@@ -36,7 +37,7 @@ umaudemc/backend/spot.py,sha256=P7vkxhY7Tx9J_rOmlua3bfiO8iMgNIuEi25ZNYZRLHk,283
36
37
  umaudemc/backend/storm.py,sha256=FlhJ0ZkJO84GjEUxuE2hQQJxJoeE_lElBB5NJL4NXTU,276
37
38
  umaudemc/command/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
39
  umaudemc/command/check.py,sha256=fzRUGAHNudZPYFk94ekwKplv9N7Fhsrmf5pOFsvPZwA,12030
39
- umaudemc/command/graph.py,sha256=_daLmzaE_Wads2jDET4Ry7xrwbQc338rm7bGluKh24o,5257
40
+ umaudemc/command/graph.py,sha256=74U-yY9NEm5oTeUjspkwy6Ve_eLBTwx8LgZDzUk2LQw,6112
40
41
  umaudemc/command/pcheck.py,sha256=RcgwQn8xBgt9eZC1sE3JzR97MB0SC6Q1AXuiKkkzJes,7274
41
42
  umaudemc/command/scheck.py,sha256=eRGE-2SsOf6etIfJQ9dJe4cSch8qAs7IuOR94i-E1_U,4653
42
43
  umaudemc/command/test.py,sha256=4Uw83V-gVbm21L0Zkv3mKOUpamiNM-qMxGVAYs-trdY,38734
@@ -47,11 +48,11 @@ umaudemc/data/result.htm,sha256=IwllBM3p4F-QFvOYZZR6bZicL-FuuPLainU9DUPPyNA,1766
47
48
  umaudemc/data/select.htm,sha256=g0eXHHFxRpxJ9tqOfSgn_QmSQy0E-ET7MimBllGk6vk,4600
48
49
  umaudemc/data/smcgraph.js,sha256=iCNQNmsuGdL_GLnqVhGDisediFtedxw3C24rxSiQwx8,6674
49
50
  umaudemc/data/smcview.css,sha256=ExFqrMkSeaf8VxFrJXflyCsRW3FTwbv78q0Hoo2UVrM,3833
50
- umaudemc/data/smcview.js,sha256=ioE4DNE1bOJjc0hQND0KKjzVDZIYnZZH58D40Y9nPqI,14113
51
+ umaudemc/data/smcview.js,sha256=_fHum1DRU1mhco-9-c6KqTLgiC5u_cCUf61jIK7wcIQ,14509
51
52
  umaudemc/data/templog.maude,sha256=TZ-66hVWoG6gp7gJpS6FsQn7dpBTLrr76bKo-UfHGcA,9161
52
- umaudemc-0.12.2.dist-info/LICENSE,sha256=MrEGL32oSWfnAZ0Bq4BZNcqnq3Mhp87Q4w6-deXfFnA,17992
53
- umaudemc-0.12.2.dist-info/METADATA,sha256=GmoVoe-UdJ48-q77XoULloQvXkOyNr8rKdRtEgcXRLk,1693
54
- umaudemc-0.12.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
55
- umaudemc-0.12.2.dist-info/entry_points.txt,sha256=8rYRlLkn4orZtAoujDSeol1t_UFBrK0bfjmLTNv9B44,52
56
- umaudemc-0.12.2.dist-info/top_level.txt,sha256=Yo_CF78HLGBSblk3890qLcx6XZ17zHCbGcT9iG8sfMw,9
57
- umaudemc-0.12.2.dist-info/RECORD,,
53
+ umaudemc-0.13.1.dist-info/LICENSE,sha256=MrEGL32oSWfnAZ0Bq4BZNcqnq3Mhp87Q4w6-deXfFnA,17992
54
+ umaudemc-0.13.1.dist-info/METADATA,sha256=FYNu7K2Mr4bn93Y0ssvIMn7jXBcK-okaAgVKP4nlBHY,1693
55
+ umaudemc-0.13.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
56
+ umaudemc-0.13.1.dist-info/entry_points.txt,sha256=8rYRlLkn4orZtAoujDSeol1t_UFBrK0bfjmLTNv9B44,52
57
+ umaudemc-0.13.1.dist-info/top_level.txt,sha256=Yo_CF78HLGBSblk3890qLcx6XZ17zHCbGcT9iG8sfMw,9
58
+ umaudemc-0.13.1.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.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5