Skip to content

Commit fcf857a

Browse files
update model for python3 and modeldb-ci support (#4)
* update model for python3 and modeldb-ci support * izhi2007.mod: `t0` as RANGE in the NEURON block Co-authored-by: Alexandru Săvulescu <[email protected]>
1 parent 4d7eed3 commit fcf857a

File tree

16 files changed

+1647
-1672
lines changed

16 files changed

+1647
-1672
lines changed

analysis.py

Lines changed: 117 additions & 118 deletions
Large diffs are not rendered by default.

arm.py

Lines changed: 70 additions & 75 deletions
Large diffs are not rendered by default.

armGraphs.py

Lines changed: 306 additions & 307 deletions
Large diffs are not rendered by default.

arminterface.py

Lines changed: 457 additions & 459 deletions
Large diffs are not rendered by default.

dummyArm.py

Lines changed: 65 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,68 @@
11
# dummyArm.py -- Python code for interfacing the sim with a virtual arm
2-
#
2+
#
33
# Last update: 07/21/14 ([email protected])
44

5-
import matplotlib
5+
import matplotlib
66
matplotlib.use('TkAgg') # for visualization
7-
from socket import *
8-
import select # for socket reading
9-
import struct # to pack messages for socket comms
7+
from socket import *
8+
import select # for socket reading
9+
import struct # to pack messages for socket comms
1010
import numpy
1111
from pylab import figure, show, ion, pause
1212

1313

14-
# Initialize and setup the sockets and data format
14+
# Initialize and setup the sockets and data format
1515
def setup():
16-
sendMsgFormat = "dd" # messages contain 2 doubles = joint angles of shoulder and elbow
17-
receiveMsgFormat = "dd" # messages contain 2 doubles = velocities
18-
receiveMsgSize = struct.calcsize(receiveMsgFormat)
19-
localHostIP = "127.0.0.1"#"localhost"#"192.168.1.2"# # set IP for local connection
20-
21-
print "Setting up connection..." # setup connection to model
22-
sockReceive = socket(AF_INET, SOCK_DGRAM) # create sockets
23-
hostPortReceive = 31000 # set port for receiving packets
24-
sockReceive.bind(('', hostPortReceive)) # bind to port
25-
sockReceive.setblocking(1) # Set blocking/non-blocking mode
26-
print ("Created UDP socket to receive packets from NEURON model; binded to port %d"%hostPortReceive)
27-
28-
sockSend = socket(AF_INET, SOCK_DGRAM) # connect to socket for sending packets
29-
hostPortSend = 32000 # set port for sending packets
30-
sockSend.connect((localHostIP, hostPortSend))
31-
sockSend.setblocking(1) # Set blocking/non-blocking mode
32-
print ("Created UDP socket to send packets to NEURON model; socket connected to IP %s, port %d" % (localHostIP, hostPortSend))
33-
34-
return sendMsgFormat, receiveMsgFormat, sockReceive, sockSend
16+
sendMsgFormat = "dd" # messages contain 2 doubles = joint angles of shoulder and elbow
17+
receiveMsgFormat = "dd" # messages contain 2 doubles = velocities
18+
receiveMsgSize = struct.calcsize(receiveMsgFormat)
19+
localHostIP = "127.0.0.1"#"localhost"#"192.168.1.2"# # set IP for local connection
20+
21+
print("Setting up connection...") # setup connection to model
22+
sockReceive = socket(AF_INET, SOCK_DGRAM) # create sockets
23+
hostPortReceive = 31000 # set port for receiving packets
24+
sockReceive.bind(('', hostPortReceive)) # bind to port
25+
sockReceive.setblocking(1) # Set blocking/non-blocking mode
26+
print(("Created UDP socket to receive packets from NEURON model; binded to port %d"%hostPortReceive))
27+
28+
sockSend = socket(AF_INET, SOCK_DGRAM) # connect to socket for sending packets
29+
hostPortSend = 32000 # set port for sending packets
30+
sockSend.connect((localHostIP, hostPortSend))
31+
sockSend.setblocking(1) # Set blocking/non-blocking mode
32+
print(("Created UDP socket to send packets to NEURON model; socket connected to IP %s, port %d" % (localHostIP, hostPortSend)))
33+
34+
return sendMsgFormat, receiveMsgFormat, sockReceive, sockSend
3535

3636
# Send and receive packets to/from virtual arm
3737
def sendAndReceivePackets(dataSend, sendMsgFormat, receiveMsgFormat, sockReceive, sockSend):
38-
dataReceived = [0,0]
39-
try:
40-
receiveMsgSize = struct.calcsize(receiveMsgFormat)
41-
dataReceivedPacked = sockReceive.recv(receiveMsgSize) # read packet from socket
42-
if len(dataReceivedPacked) == receiveMsgSize:
43-
dataReceived = struct.unpack(receiveMsgFormat, dataReceivedPacked)
44-
print "Received packet from model: (%.2f,%.2f)" % (dataReceived[0],dataReceived[1])
45-
except:
46-
print "Error receiving packet"
47-
48-
inputready, outputready, e = select.select([] ,[sockSend],[], 0.0) # check if other side ready to receive
49-
if len(outputready)>0:
50-
try:
51-
sent = sockSend.send(struct.pack(sendMsgFormat, dataSend[0], dataSend[1])) # send packet
52-
print "Sent packet to virtual arm: (%.2f, %.2f)" % (dataSend[0], dataSend[1])
53-
except:
54-
print "Sending socket ready but error sending packet"
55-
else:
56-
print "Sending socket not ready"
57-
return dataReceived
38+
dataReceived = [0,0]
39+
try:
40+
receiveMsgSize = struct.calcsize(receiveMsgFormat)
41+
dataReceivedPacked = sockReceive.recv(receiveMsgSize) # read packet from socket
42+
if len(dataReceivedPacked) == receiveMsgSize:
43+
dataReceived = struct.unpack(receiveMsgFormat, dataReceivedPacked)
44+
print("Received packet from model: (%.2f,%.2f)" % (dataReceived[0],dataReceived[1]))
45+
except:
46+
print("Error receiving packet")
47+
48+
inputready, outputready, e = select.select([] ,[sockSend],[], 0.0) # check if other side ready to receive
49+
if len(outputready)>0:
50+
try:
51+
sent = sockSend.send(struct.pack(sendMsgFormat, dataSend[0], dataSend[1])) # send packet
52+
print("Sent packet to virtual arm: (%.2f, %.2f)" % (dataSend[0], dataSend[1]))
53+
except:
54+
print("Sending socket ready but error sending packet")
55+
else:
56+
print("Sending socket not ready")
57+
return dataReceived
5858

5959
# Main code for simple virtual arm
6060
duration = 4 # sec
6161
interval = 0.010 # time between packets (sec)
62-
L1 = 1.0 # arm segment 1 length
62+
L1 = 1.0 # arm segment 1 length
6363
L2 = 0.8 # arm segment 2 length
64-
shang = numpy.pi/2 # shoulder angle (rad)
65-
elang = numpy.pi/2 # elbow angle (rad)
64+
shang = numpy.pi/2 # shoulder angle (rad)
65+
elang = numpy.pi/2 # elbow angle (rad)
6666
shvel = 0 # shoulder velocity (rad/s)
6767
elvel = 0 # elbow velocity (rad/s)
6868
friction = 0.1 # friction coefficient
@@ -75,29 +75,21 @@ def sendAndReceivePackets(dataSend, sendMsgFormat, receiveMsgFormat, sockReceiv
7575
ax.grid()
7676
line, = ax.plot([], [], 'o-', lw=2)
7777

78-
raw_input("Press Enter to continue...")
78+
input("Press Enter to continue...")
7979
for i in numpy.arange(0, duration, interval):
80-
shang = (shang + shvel * interval) % (2*numpy.pi) # update shoulder angle
81-
elang = (elang + elvel * interval) % (2*numpy.pi)# update elbow angle
82-
if shang<0: shang = 2*numpy.pi + shang
83-
if elang<0: elang = 2*numpy.pi + shang
84-
shpos = [L1*numpy.sin(shang), L1*numpy.cos(shang)] # calculate shoulder x-y pos
85-
elpos = [L2*numpy.sin(shang+elang) + shpos[0], L2*numpy.cos(shang+elang) + shpos[1]] # calculate elbow x-y pos
86-
87-
dataSend = [shang, elang] # set data to send
88-
dataReceived = sendAndReceivePackets(dataSend, sendMsgFormat, receiveMsgFormat, sockReceive, sockSend) # send and receive data
89-
shvel = shvel+dataReceived[0] - (friction * shvel)# update velocities based on incoming commands (accelerations) and friction
90-
elvel = elvel+dataReceived[1] - (friction * elvel)
91-
92-
line.set_data([0, shpos[0], elpos[0]], [0, shpos[1], elpos[1]]) # update line in figure
93-
ax.set_title('Time = %.1f ms, shoulder: pos=%.2f rad, vel=%.2f, acc=%.2f ; elbow: pos = %.2f rad, vel = %.2f, acc=%.2f' % (float(i)*1000, shang, shvel, dataReceived[0] - (friction * shvel), elang, elvel, dataReceived[1] - (friction * elvel) ), fontsize=10)
94-
show()
95-
pause(0.0001) # pause so that the figure refreshes at every time step
96-
97-
98-
99-
100-
101-
102-
103-
80+
shang = (shang + shvel * interval) % (2*numpy.pi) # update shoulder angle
81+
elang = (elang + elvel * interval) % (2*numpy.pi)# update elbow angle
82+
if shang<0: shang = 2*numpy.pi + shang
83+
if elang<0: elang = 2*numpy.pi + shang
84+
shpos = [L1*numpy.sin(shang), L1*numpy.cos(shang)] # calculate shoulder x-y pos
85+
elpos = [L2*numpy.sin(shang+elang) + shpos[0], L2*numpy.cos(shang+elang) + shpos[1]] # calculate elbow x-y pos
86+
87+
dataSend = [shang, elang] # set data to send
88+
dataReceived = sendAndReceivePackets(dataSend, sendMsgFormat, receiveMsgFormat, sockReceive, sockSend) # send and receive data
89+
shvel = shvel+dataReceived[0] - (friction * shvel)# update velocities based on incoming commands (accelerations) and friction
90+
elvel = elvel+dataReceived[1] - (friction * elvel)
91+
92+
line.set_data([0, shpos[0], elpos[0]], [0, shpos[1], elpos[1]]) # update line in figure
93+
ax.set_title('Time = %.1f ms, shoulder: pos=%.2f rad, vel=%.2f, acc=%.2f ; elbow: pos = %.2f rad, vel = %.2f, acc=%.2f' % (float(i)*1000, shang, shvel, dataReceived[0] - (friction * shvel), elang, elvel, dataReceived[1] - (friction * elvel) ), fontsize=10)
94+
show()
95+
pause(0.0001) # pause so that the figure refreshes at every time step

error.py

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,77 +4,77 @@
44

55

66
def getTarget0err(f):
7-
stdin,stdout = os.popen2("tail -n 4 "+f)
8-
stdin.close()
9-
lines = stdout.readlines(); stdout.close()
10-
line = lines[0].split()
11-
return float(line[5])
7+
stdin,stdout = os.popen2("tail -n 4 "+f)
8+
stdin.close()
9+
lines = stdout.readlines(); stdout.close()
10+
line = lines[0].split()
11+
return float(line[5])
1212

1313
def errorFromShell(filestem, readTarget0ErrFromRunFile, maxGens, maxCands, maxTargets):
1414

1515
minVal = 1
1616
minValtarg0 = 1
1717
for igen in range(maxGens):
18-
for icand in range(maxCands):
19-
error = []
20-
for itarget in range(maxTargets):
21-
try:
22-
errfilename = '%s/gen_%s_cand_%d_target_%d_error' % (filestem,igen,icand,itarget)
23-
runfilename = '%s/gen_%s_cand_%d.run' % (filestem,igen,icand)
24-
with open(errfilename, 'r') as f:
25-
error.append(pickle.load(f))
26-
print 'gen=%d, cand=%d, target=%d: error = %f' % (igen, icand, itarget, error[-1])
27-
except:
28-
print('not found file: stem=%s, gen=%d, cand=%d, targ=%d' % (filestem,igen,icand,itarget))
29-
avgErr = pylab.mean(error)
30-
if readTarget0ErrFromRunFile:
31-
try:
32-
target0err = getTarget0err(runfilename)
33-
print "error target 0: %.2f \n" % (target0err)
34-
if target0err < minValtarg0:
35-
minValtarg0 = target0err
36-
minCandtarg0 = icand
37-
minGentarg0 = igen
38-
except:
39-
print "error reading file:", runfilename
18+
for icand in range(maxCands):
19+
error = []
20+
for itarget in range(maxTargets):
21+
try:
22+
errfilename = '%s/gen_%s_cand_%d_target_%d_error' % (filestem,igen,icand,itarget)
23+
runfilename = '%s/gen_%s_cand_%d.run' % (filestem,igen,icand)
24+
with open(errfilename, 'r') as f:
25+
error.append(pickle.load(f))
26+
print('gen=%d, cand=%d, target=%d: error = %f' % (igen, icand, itarget, error[-1]))
27+
except:
28+
print(('not found file: stem=%s, gen=%d, cand=%d, targ=%d' % (filestem,igen,icand,itarget)))
29+
avgErr = pylab.mean(error)
30+
if readTarget0ErrFromRunFile:
31+
try:
32+
target0err = getTarget0err(runfilename)
33+
print("error target 0: %.2f \n" % (target0err))
34+
if target0err < minValtarg0:
35+
minValtarg0 = target0err
36+
minCandtarg0 = icand
37+
minGentarg0 = igen
38+
except:
39+
print("error reading file:", runfilename)
4040

41-
print "avg error: %.2f \n" % (avgErr)
42-
if avgErr < minVal:
43-
minVal = avgErr
44-
minCand = icand
45-
minGen = igen
41+
print("avg error: %.2f \n" % (avgErr))
42+
if avgErr < minVal:
43+
minVal = avgErr
44+
minCand = icand
45+
minGen = igen
4646

47-
print "Min error = %f ; gen = %d ; cand = %d \n" % (minVal, minGen, minCand)
48-
if readTarget0ErrFromRunFile:
49-
print "Min error (target 0) = %f ; gen = %d ; cand = %d \n" % (minValtarg0, minGentarg0, minCandtarg0)
47+
print("Min error = %f ; gen = %d ; cand = %d \n" % (minVal, minGen, minCand))
48+
if readTarget0ErrFromRunFile:
49+
print("Min error (target 0) = %f ; gen = %d ; cand = %d \n" % (minValtarg0, minGentarg0, minCandtarg0))
5050

5151
def errorFromPickle(filestem, maxGens, maxCands):
5252
from collections import OrderedDict
5353
minVals = OrderedDict
5454
minVals = {'error0_pre': [1,0,0], 'error1_pre': [1,0,0], 'error_pre': [1,0,0], 'errord_pre': [1,0,0], \
5555
'error0_post': [1,0,0], 'error1_post': [1,0,0], 'error_post': [1,0,0], 'errord_post': [1,0,0], \
5656
'error0_lesion': [1,0,0], 'error1_lesion': [1,0,0], 'error_pre': [1,0,0], 'errord_tot': [1,0,0], 'error_fitness': [1,0,0]}
57-
57+
5858
for igen in range(maxGens):
5959
for icand in range(maxCands):
6060
error = []
6161
try:
6262
errfilename = '%s/gen_%d_cand_%d_target_0_error' % (filestem,igen,icand)
6363
with open(errfilename, 'r') as f:
64-
error = pickle.load(f)
65-
#print 'gen=%d, cand=%d, errord_tot = %f, error_fitness = %f' % (igen, icand, error['errord_tot'], error['error_fitness'])
66-
for key,val in error.iteritems():
67-
if val < minVals[key][0]:
64+
error = pickle.load(f)
65+
#print 'gen=%d, cand=%d, errord_tot = %f, error_fitness = %f' % (igen, icand, error['errord_tot'], error['error_fitness'])
66+
for key,val in error.items():
67+
if val < minVals[key][0]:
6868
minVals[key][0] = val
6969
minVals[key][1] = igen
7070
minVals[key][2] = icand
7171
except:
72-
print('not found file: stem=%s, gen=%d, cand=%d' % (filestem,igen,icand))
72+
print(('not found file: stem=%s, gen=%d, cand=%d' % (filestem,igen,icand)))
73+
74+
for key,val in minVals.items():
75+
print("%s = %f ; gen = %d ; cand = %d \n" % (key, val[0], val[1], val[2]))
76+
7377

74-
for key,val in minVals.iteritems():
75-
print "%s = %f ; gen = %d ; cand = %d \n" % (key, val[0], val[1], val[2])
76-
77-
7878

7979
# set params
8080
filestem = '../data/15aug29_evolutionStrategy'
@@ -88,5 +88,3 @@ def errorFromPickle(filestem, maxGens, maxCands):
8888

8989
# call function to obtain errors from pickle file
9090
errorFromPickle(filestem, maxGens, maxCands)
91-
92-

0 commit comments

Comments
 (0)