-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsystem.py
137 lines (125 loc) · 4.2 KB
/
system.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import json
import timeInterval
from timedWord import ResetTimedWord, TimedWord
class System(object):
def __init__(self, inputs, states, trans, initState, acceptStates):
self.inputs = inputs
self.states = states
self.trans = trans
self.initState = initState
self.acceptStates = acceptStates
class SysTran(object):
def __init__(self, tranId, source, input, guards, isReset, target):
self.tranId = tranId
self.source = source
self.input = input
self.guards = guards
self.isReset = isReset
self.target = target
def isPass(self, tw):
if tw.input == self.input:
for guard in self.guards:
if guard.isInInterval(tw.time):
return True
return False
def showGuards(self):
temp = self.guards[0].show()
for i in range(1, len(self.guards)):
temp = temp + 'U' + self.guards[i].show()
return temp
# build target system
def buildSystem(jsonFile):
with open(jsonFile, 'r') as f:
data = json.load(f)
inputs = data["inputs"]
states = data["states"]
trans = data["trans"]
initState = data["initState"]
acceptStates = data["acceptStates"]
# trans
transSet = []
for tran in trans:
tranId = str(tran)
source = trans[tran][0]
target = trans[tran][4]
input = trans[tran][1]
# reset signal
resetTemp = trans[tran][3]
isReset = False
if resetTemp == "r":
isReset = True
# time guard
intervalsStr = trans[tran][2]
intervalsList = intervalsStr.split('U')
guards = []
for guard in intervalsList:
newGuard = timeInterval.Guard(guard.strip())
guards.append(newGuard)
systemTran = SysTran(tranId, source, input, guards, isReset, target)
transSet += [systemTran]
transSet.sort(key=lambda x: x.tranId)
system = System(inputs, states, transSet, initState, acceptStates)
return system
# input -> DTWs,output -> DRTWs and value - for delay-timed test
def systemTest(DTWs, targetSys):
DRTWs = []
value = []
nowTime = 0
curState = targetSys.initState
for dtw in DTWs:
if curState == "sink":
DRTWs.append(ResetTimedWord(dtw.input, dtw.time, True))
value = -1
else:
time = dtw.time + nowTime
newLTW = TimedWord(dtw.input, time)
flag = False
for tran in targetSys.trans:
if tran.source == curState and tran.isPass(newLTW):
flag = True
curState = tran.target
if tran.isReset:
nowTime = 0
isReset = True
else:
nowTime = time
isReset = False
DRTWs.append(ResetTimedWord(dtw.input, dtw.time, isReset))
break
if not flag:
DRTWs.append(ResetTimedWord(dtw.input, dtw.time, True))
value = -1
curState = "sink"
if curState in targetSys.acceptStates:
value = 1
elif curState != 'sink':
value = 0
return DRTWs, value
# input -> DTW(single),output -> curState and value - for logical-timed test
def systemOutput(DTW, nowTime, curState, targetSys):
value = None
resetFlag = False
tranFlag = False # tranFlag为true表示有这样的迁移
if DTW is None:
if curState in targetSys.acceptStates:
value = 1
else:
value = 0
else:
LTW = TimedWord(DTW.input, DTW.time + nowTime)
for tran in targetSys.trans:
if tran.source == curState and tran.isPass(LTW):
tranFlag = True
curState = tran.target
if tran.isReset:
resetFlag = True
break
if not tranFlag:
value = -1
curState = 'sink'
resetFlag = True
if curState in targetSys.acceptStates:
value = 1
elif curState != 'sink':
value = 0
return curState, value, resetFlag