Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
Seminar-HFO
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Shashank Suhas
Seminar-HFO
Commits
b7af2fe4
Commit
b7af2fe4
authored
May 28, 2017
by
DurgeshSamant
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
python3 port
parent
eb26f8fc
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
253 additions
and
63 deletions
+253
-63
bin/Communicator.py
bin/Communicator.py
+5
-5
bin/HFO
bin/HFO
+8
-8
bin/HFO.bak
bin/HFO.bak
+192
-0
bin/Teams.py
bin/Teams.py
+2
-2
bin/Trainer.py
bin/Trainer.py
+32
-32
example/communication_agent.py
example/communication_agent.py
+2
-2
example/hfo_example_agent.py
example/hfo_example_agent.py
+1
-1
example/high_level_random_agent.py
example/high_level_random_agent.py
+1
-1
hfo/hfo.py
hfo/hfo.py
+9
-11
setup.py
setup.py
+1
-1
No files found.
bin/Communicator.py
View file @
b7af2fe4
...
...
@@ -9,7 +9,7 @@ Modified: 2010-11-07
'''
import
socket
,
sys
,
time
import
cP
ickle
as
pickle
import
p
ickle
as
pickle
defaultPort
=
5557
...
...
@@ -43,7 +43,7 @@ class Communicator(object):
def
sendMsg
(
self
,
msg
):
#print 'sending',msg
self
.
_sock
.
sendto
(
msg
+
'
\0
'
,
self
.
_addr
)
self
.
_sock
.
sendto
(
(
msg
+
'
\0
'
)
.
encode
(
'utf-8'
)
,
self
.
_addr
)
def
recvMsg
(
self
,
event
=
None
,
retryCount
=
None
):
msg
=
self
.
_storedMsg
...
...
@@ -53,7 +53,7 @@ class Communicator(object):
newMsg
=
''
try
:
newMsg
,
self
.
_addr
=
self
.
_sock
.
recvfrom
(
8192
)
msg
+=
newMsg
msg
+=
newMsg
.
decode
(
'utf-8'
)
except
socket
.
error
:
#time.sleep(0.1)
pass
...
...
@@ -62,7 +62,7 @@ class Communicator(object):
raise
TimeoutError
else
:
retryCount
-=
1
print
'[Trainer] waiting for message, retry ='
,
retryCount
print
(
'[Trainer] waiting for message, retry ='
,
retryCount
)
time
.
sleep
(
0.3
)
#raise ValueError('Error while receiving message')
(
msg
,
sep
,
rest
)
=
msg
.
partition
(
'
\0
'
)
...
...
@@ -88,5 +88,5 @@ class ClientCommunicator(Communicator):
self
.
_sock
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
self
.
_sock
.
settimeout
(
5
)
except
:
print
>>
sys
.
stderr
,
'Error creating socket'
sys
.
stderr
.
write
(
'Error creating socket'
)
raise
bin/HFO
View file @
b7af2fe4
...
...
@@ -84,9 +84,9 @@ def main(args):
# Run
trainer
.
run
(
necProcesses
,
args
.
offenseTeam
,
args
.
defenseTeam
)
except
KeyboardInterrupt
:
print
'[start.py] Exiting for CTRL-C'
print
(
'[start.py] Exiting for CTRL-C'
)
finally
:
print
'[start.py] Cleaning up server and other processes'
print
(
'[start.py] Cleaning up server and other processes'
)
for
p
in
reversed
(
processes
):
try
:
p
.
terminate
()
...
...
@@ -160,23 +160,23 @@ def parseArgs():
p
.
add_argument
(
'--verbose'
,
dest
=
'verbose'
,
action
=
'store_true'
,
default
=
False
,
help
=
'Print verbose output.'
)
args
=
p
.
parse_args
()
if
args
.
offenseAgents
not
in
xrange
(
0
,
11
):
if
args
.
offenseAgents
not
in
list
(
range
(
0
,
11
)
):
p
.
error
(
'argument --offense-agents: invalid choice: '
\
+
str
(
args
.
offenseAgents
)
+
' (choose from [0-10])'
)
if
args
.
offenseNPCs
not
in
xrange
(
0
,
11
):
if
args
.
offenseNPCs
not
in
list
(
range
(
0
,
11
)
):
p
.
error
(
'argument --offense-npcs: invalid choice: '
\
+
str
(
args
.
offenseNPCs
)
+
' (choose from [0-10])'
)
if
args
.
defenseAgents
not
in
xrange
(
0
,
12
):
if
args
.
defenseAgents
not
in
list
(
range
(
0
,
12
)
):
p
.
error
(
'argument --defense-agents: invalid choice: '
\
+
str
(
args
.
defenseAgents
)
+
' (choose from [0-11])'
)
if
args
.
defenseNPCs
not
in
xrange
(
0
,
12
):
if
args
.
defenseNPCs
not
in
list
(
range
(
0
,
12
)
):
p
.
error
(
'argument --offense-npcs: invalid choice: '
\
+
str
(
args
.
defenseNPCs
)
+
' (choose from [0-11])'
)
if
args
.
offenseAgents
+
args
.
offenseNPCs
not
in
xrange
(
1
,
11
):
if
args
.
offenseAgents
+
args
.
offenseNPCs
not
in
list
(
range
(
1
,
11
)
):
p
.
error
(
'Offense players (offense-agents + offense-npcs): '
\
'invalid choice: '
+
str
(
args
.
offenseAgents
+
args
.
offenseNPCs
)
+
\
' (choose from [1,10])'
)
if
args
.
defenseAgents
+
args
.
defenseNPCs
not
in
xrange
(
0
,
12
):
if
args
.
defenseAgents
+
args
.
defenseNPCs
not
in
list
(
range
(
0
,
12
)
):
p
.
error
(
'Defense players (defense-agents + defense-npcs): '
\
'invalid choice: '
+
str
(
args
.
defenseAgents
+
args
.
defenseNPCs
)
+
\
' (choose from [0,11])'
)
...
...
bin/HFO.bak
0 → 100755
View file @
b7af2fe4
#!/usr/bin/env python
# encoding: utf-8
import
subprocess
,
os
,
time
,
numpy
,
sys
# Global list of all/essential running processes
processes
,
necProcesses
=
[],
[]
# Command to run the rcssserver. Edit as needed.
SERVER_BIN
=
'rcssserver'
# Command to run the monitor. Edit as needed.
MONITOR_BIN
=
'soccerwindow2'
def
launch
(
cmd
,
name
=
'Unknown'
,
necessary
=
True
,
supressOutput
=
True
):
"""Launch a process.
Appends to list of processes and (optionally) necProcesses if
necessary flag is True.
Returns: The launched process.
"""
kwargs
=
{}
if
supressOutput
:
kwargs
=
{
'stdout'
:
open
(
'/dev/null'
,
'w'
),
'stderr'
:
open
(
'/dev/null'
,
'w'
)}
p
=
subprocess
.
Popen
(
cmd
.
split
(
' '
),
shell
=
False
,
**
kwargs
)
processes
.
append
(
p
)
if
necessary
:
necProcesses
.
append
([
p
,
name
])
return
p
def
main
(
args
):
"""Sets up the teams, launches the server and monitor, starts the trainer.
"""
if
args
.
logging
and
not
os
.
path
.
exists
(
args
.
logDir
):
os
.
makedirs
(
args
.
logDir
)
num_agents
=
args
.
offenseAgents
+
args
.
defenseAgents
binary_dir
=
os
.
path
.
dirname
(
os
.
path
.
realpath
(
__file__
))
server_port
=
args
.
port
coach_port
=
args
.
port
+
1
olcoach_port
=
args
.
port
+
2
serverCommand
=
os
.
path
.
join
(
binary_dir
,
SERVER_BIN
)
serverOptions
=
' server::port=
%
i server::coach_port=
%
i '
\
'server::olcoach_port=
%
i server::coach=1 '
\
'server::game_logging=
%
i server::text_logging=
%
i '
\
'server::hfo_logging=
%
i server::hfo_log_dir=
%
s '
\
'server::game_log_dir=
%
s server::text_log_dir=
%
s '
\
'server::synch_mode=
%
i server::hfo=1 '
\
'server::fullstate_l=
%
i server::fullstate_r=
%
i '
\
'server::coach_w_referee=1 server::hfo_max_trial_time=
%
i '
\
'server::hfo_max_trials=
%
i server::hfo_max_frames=
%
i '
\
'server::hfo_offense_on_ball=
%
i server::random_seed=
%
i '
\
'server::hfo_max_untouched_time=
%
i '
\
'server::hfo_min_ball_pos_x=
%
f '
\
'server::hfo_max_ball_pos_x=
%
f '
\
'server::say_msg_size=
%
i '
\
'server::record_messages=
%
i'
\
%
(
server_port
,
coach_port
,
olcoach_port
,
args
.
logging
,
args
.
logging
,
args
.
logging
,
args
.
logDir
,
args
.
logDir
,
args
.
logDir
,
args
.
sync
,
args
.
fullstate
,
args
.
fullstate
,
args
.
maxFramesPerTrial
,
args
.
numTrials
,
args
.
numFrames
,
args
.
offenseOnBall
,
args
.
seed
,
args
.
maxUntouchedTime
,
args
.
min_ball_x
,
args
.
max_ball_x
,
args
.
messageSize
,
args
.
verbose
)
try
:
# Launch the Server
server
=
launch
(
serverCommand
+
serverOptions
,
name
=
'server'
,
supressOutput
=
not
args
.
verbose
)
time
.
sleep
(
0.2
)
assert
server
.
poll
()
is
None
,
\
'[start.py] Failed to launch Server with command:
\"
%
s
\"
'
\
'
\n\n
Another rcssserver may be running on the same port?'
\
'
\n
Try:
\"
killall -9 rcssserver
\"
'
\
%
(
serverCommand
+
serverOptions
)
if
not
args
.
headless
:
monitorCommand
=
os
.
path
.
join
(
binary_dir
,
MONITOR_BIN
)
monitorOptions
=
' --connect --port=
%
i'
%
(
server_port
)
launch
(
monitorCommand
+
monitorOptions
,
name
=
'monitor'
)
# Launch the Trainer
from
Trainer
import
Trainer
trainer
=
Trainer
(
args
=
args
,
server_port
=
server_port
,
coach_port
=
coach_port
)
trainer
.
initComm
()
# Run
trainer
.
run
(
necProcesses
,
args
.
offenseTeam
,
args
.
defenseTeam
)
except
KeyboardInterrupt
:
print
(
'[start.py] Exiting for CTRL-C'
)
finally
:
print
(
'[start.py] Cleaning up server and other processes'
)
for
p
in
reversed
(
processes
):
try
:
p
.
terminate
()
time
.
sleep
(
0.1
)
p
.
kill
()
except
:
pass
def
parseArgs
():
import
argparse
team_dir
=
os
.
path
.
join
(
os
.
path
.
dirname
(
os
.
path
.
realpath
(
__file__
)),
'teams'
)
installed_teams
=
os
.
listdir
(
team_dir
)
p
=
argparse
.
ArgumentParser
(
description
=
'Start Half Field Offense.'
,
formatter_class
=
argparse
.
RawTextHelpFormatter
)
p
.
add_argument
(
'--headless'
,
dest
=
'headless'
,
action
=
'store_true'
,
help
=
'Run without a monitor.'
)
p
.
add_argument
(
'--trials'
,
dest
=
'numTrials'
,
type
=
int
,
default
=-
1
,
help
=
'Number of trials to run.
\n
'
\
'Negative values mean unlimited. Default: -1.'
)
p
.
add_argument
(
'--frames'
,
dest
=
'numFrames'
,
type
=
int
,
default
=-
1
,
help
=
'Number of frames to run for.
\n
'
\
'Negative values mean unlimited. Default: -1.'
)
p
.
add_argument
(
'--frames-per-trial'
,
dest
=
'maxFramesPerTrial'
,
type
=
int
,
default
=
1000
,
help
=
'Max number of frames per trial.
\n
'
\
'Negative values mean unlimited. Default: 1000.'
)
p
.
add_argument
(
'--untouched-time'
,
dest
=
'maxUntouchedTime'
,
type
=
int
,
default
=
100
,
help
=
'Ends trial if ball is untouched for this long.
\n
'
\
'Negative values mean unlimited. Default: 100.'
)
p
.
add_argument
(
'--offense-agents'
,
dest
=
'offenseAgents'
,
type
=
int
,
default
=
0
,
help
=
'Number of offensive agents. Default: 0.'
)
p
.
add_argument
(
'--defense-agents'
,
dest
=
'defenseAgents'
,
type
=
int
,
default
=
0
,
help
=
'Number of defensive agents. Default: 0.'
)
p
.
add_argument
(
'--offense-npcs'
,
dest
=
'offenseNPCs'
,
type
=
int
,
default
=
0
,
help
=
'Number of offensive uncontrolled players. Default: 0.'
)
p
.
add_argument
(
'--defense-npcs'
,
dest
=
'defenseNPCs'
,
type
=
int
,
default
=
0
,
help
=
'Number of defensive uncontrolled players. Default: 0.'
)
p
.
add_argument
(
'--agent-play-goalie'
,
dest
=
'agentPlayGoalie'
,
action
=
'store_true'
,
default
=
False
,
help
=
'Defense-agent plays goalie, rather than defender.'
)
p
.
add_argument
(
'--offense-team'
,
dest
=
'offenseTeam'
,
type
=
str
,
default
=
'base'
,
help
=
'Offense team binary. Options: '
+
str
(
installed_teams
)
+
'. Default: base.'
)
p
.
add_argument
(
'--defense-team'
,
dest
=
'defenseTeam'
,
type
=
str
,
default
=
'base'
,
help
=
'Defense team binary. Options: '
+
str
(
installed_teams
)
+
'. Default: base.'
)
p
.
add_argument
(
'--no-sync'
,
dest
=
'sync'
,
action
=
'store_false'
,
default
=
True
,
help
=
'Run server in non-sync mode.'
)
p
.
add_argument
(
'--port'
,
dest
=
'port'
,
type
=
int
,
default
=
6000
,
help
=
'Agent server
\'
s port. Default: 6000.
\n
'
\
'rcssserver, coach, and ol_coach will be '
\
'incrementally allocated the following ports.'
)
p
.
add_argument
(
'--no-logging'
,
dest
=
'logging'
,
action
=
'store_false'
,
default
=
True
,
help
=
'Disable rcssserver logging.'
)
p
.
add_argument
(
'--log-dir'
,
dest
=
'logDir'
,
default
=
'log/'
,
help
=
'Directory to store logs. Default: log/'
)
p
.
add_argument
(
'--record'
,
dest
=
'record'
,
action
=
'store_true'
,
help
=
'Record logs of states and actions.'
)
p
.
add_argument
(
'--offense-on-ball'
,
dest
=
'offenseOnBall'
,
type
=
int
,
default
=
0
,
help
=
'Ball given to the player represented by the value.
\n
'
\
'If value greater than the number of offense players, '
\
'ball given to a random offense player.
\n
'
\
'If value non-positive, ball is not given to any player.
\n
'
\
'Default: 0.'
)
p
.
add_argument
(
'--fullstate'
,
dest
=
'fullstate'
,
action
=
'store_true'
,
help
=
'Server provides full-state information to agents.'
)
p
.
add_argument
(
'--seed'
,
dest
=
'seed'
,
type
=
int
,
default
=-
1
,
help
=
'Seed the server
\'
s RNG. Default: time.'
)
p
.
add_argument
(
'--message-size'
,
dest
=
'messageSize'
,
type
=
int
,
default
=
1000
,
help
=
'Message size limit for communication'
)
p
.
add_argument
(
'--ball-x-min'
,
dest
=
'min_ball_x'
,
type
=
float
,
default
=
0.0
,
help
=
'Ball initialization min x position: [0,1]. Default: 0'
)
p
.
add_argument
(
'--ball-x-max'
,
dest
=
'max_ball_x'
,
type
=
float
,
default
=
0.2
,
help
=
'Ball initialization max x position: [0,1]. Default: .2'
)
p
.
add_argument
(
'--verbose'
,
dest
=
'verbose'
,
action
=
'store_true'
,
default
=
False
,
help
=
'Print verbose output.'
)
args
=
p
.
parse_args
()
if
args
.
offenseAgents
not
in
range
(
0
,
11
):
p
.
error
(
'argument --offense-agents: invalid choice: '
\
+
str
(
args
.
offenseAgents
)
+
' (choose from [0-10])'
)
if
args
.
offenseNPCs
not
in
range
(
0
,
11
):
p
.
error
(
'argument --offense-npcs: invalid choice: '
\
+
str
(
args
.
offenseNPCs
)
+
' (choose from [0-10])'
)
if
args
.
defenseAgents
not
in
range
(
0
,
12
):
p
.
error
(
'argument --defense-agents: invalid choice: '
\
+
str
(
args
.
defenseAgents
)
+
' (choose from [0-11])'
)
if
args
.
defenseNPCs
not
in
range
(
0
,
12
):
p
.
error
(
'argument --offense-npcs: invalid choice: '
\
+
str
(
args
.
defenseNPCs
)
+
' (choose from [0-11])'
)
if
args
.
offenseAgents
+
args
.
offenseNPCs
not
in
range
(
1
,
11
):
p
.
error
(
'Offense players (offense-agents + offense-npcs): '
\
'invalid choice: '
+
str
(
args
.
offenseAgents
+
args
.
offenseNPCs
)
+
\
' (choose from [1,10])'
)
if
args
.
defenseAgents
+
args
.
defenseNPCs
not
in
range
(
0
,
12
):
p
.
error
(
'Defense players (defense-agents + defense-npcs): '
\
'invalid choice: '
+
str
(
args
.
defenseAgents
+
args
.
defenseNPCs
)
+
\
' (choose from [0,11])'
)
if
args
.
offenseTeam
not
in
installed_teams
:
p
.
error
(
'Unrecognized offense team: '
+
str
(
args
.
offenseTeam
))
if
args
.
defenseTeam
not
in
installed_teams
:
p
.
error
(
'Unrecognized defense team: '
+
str
(
args
.
defenseTeam
))
if
args
.
agentPlayGoalie
and
args
.
defenseAgents
<=
0
:
p
.
error
(
'You must add a --defense-agent before it can play goalie.'
)
return
args
if
__name__
==
'__main__'
:
main
(
parseArgs
())
bin/Teams.py
View file @
b7af2fe4
...
...
@@ -71,7 +71,7 @@ class Agent2d(Team):
launchOpts
=
None
if
player_num
==
1
:
launchOpts
=
'-g'
print
'Launch npc
%
s-
%
d'
%
(
self
.
_name
,
player_num
)
print
(
'Launch npc
%
s-
%
d'
%
(
self
.
_name
,
player_num
)
)
return
self
.
start_npc_proc
(
launchOpts
)
...
...
@@ -99,5 +99,5 @@ class Helios(Team):
launchOpts
=
None
if
player_num
==
1
:
launchOpts
=
'-g'
print
'Launch npc
%
s-
%
d'
%
(
self
.
_name
,
player_num
)
print
(
'Launch npc
%
s-
%
d'
%
(
self
.
_name
,
player_num
)
)
return
self
.
start_npc_proc
(
launchOpts
)
bin/Trainer.py
View file @
b7af2fe4
...
...
@@ -72,11 +72,11 @@ class Trainer(object):
binary_dir
=
os
.
path
.
join
(
os
.
path
.
dirname
(
os
.
path
.
realpath
(
__file__
)),
'teams'
,
'base'
)
config_dir
=
os
.
path
.
join
(
binary_dir
,
'config/formations-dt'
)
print
(
"Waiting for player-controlled agent
%
s-
%
d: config_dir=
%
s, "
\
print
(
(
"Waiting for player-controlled agent
%
s-
%
d: config_dir=
%
s, "
\
"server_port=
%
d, server_addr=
%
s, team_name=
%
s, play_goalie=
%
r"
%
(
self
.
_offenseTeamName
if
play_offense
else
self
.
_defenseTeamName
,
agent_num
,
config_dir
,
self
.
_serverPort
,
"localhost"
,
team_name
,
agent_ext_num
==
1
))
agent_ext_num
==
1
))
)
if
wait_until_join
:
self
.
waitOnPlayer
(
agent_ext_num
,
play_offense
)
return
None
...
...
@@ -85,7 +85,7 @@ class Trainer(object):
""" Given a team name, returns the team object. """
teams_dir
=
os
.
path
.
join
(
os
.
path
.
dirname
(
os
.
path
.
realpath
(
__file__
)),
'teams'
)
if
requested_team_name
==
'helios'
:
print
'Creating team Helios'
print
(
'Creating team Helios'
)
team_name
=
'HELIOS_'
+
(
'left'
if
play_offense
else
'right'
)
team_dir
=
os
.
path
.
join
(
teams_dir
,
'helios'
,
'helios-13Eindhoven'
)
lib_dir
=
os
.
path
.
join
(
teams_dir
,
'helios'
,
'local'
,
'lib'
)
...
...
@@ -93,7 +93,7 @@ class Trainer(object):
binaryName
=
'helios_player'
,
host
=
'localhost'
,
port
=
self
.
_serverPort
)
elif
requested_team_name
==
'base'
:
print
'Creating team Agent2d (base)'
print
(
'Creating team Agent2d (base)'
)
team_name
=
'base_'
+
(
'left'
if
play_offense
else
'right'
)
team_dir
=
os
.
path
.
join
(
teams_dir
,
'base'
)
lib_dir
=
None
...
...
@@ -102,7 +102,7 @@ class Trainer(object):
record
=
self
.
_record
,
host
=
'localhost'
,
port
=
self
.
_serverPort
)
else
:
print
'Unknown team requested: '
+
requested_team_name
print
(
'Unknown team requested: '
+
requested_team_name
)
sys
.
exit
(
1
)
def
getTeams
(
self
,
offense_team_name
,
defense_team_name
):
...
...
@@ -179,8 +179,8 @@ class Trainer(object):
self
.
_done
=
True
if
endOfTrial
:
self
.
_numTrials
+=
1
print
'EndOfTrial:
%
d /
%
d
%
d
%
s'
%
\
(
self
.
_numGoals
,
self
.
_numTrials
,
self
.
_frame
,
event
)
print
(
'EndOfTrial:
%
d /
%
d
%
d
%
s'
%
\
(
self
.
_numGoals
,
self
.
_numTrials
,
self
.
_frame
,
event
)
)
self
.
_numFrames
+=
self
.
_frame
-
self
.
_lastTrialStart
self
.
_lastTrialStart
=
self
.
_frame
self
.
getConnectedPlayers
()
...
...
@@ -199,16 +199,16 @@ class Trainer(object):
msg
=
msg
[
1
:
length
+
1
]
if
msg
==
'START'
:
if
self
.
_isPlaying
:
print
'Already playing, ignoring message'
print
(
'Already playing, ignoring message'
)
else
:
self
.
startGame
()
elif
msg
==
'DONE'
:
raise
DoneError
elif
msg
==
'ready'
:
print
'Agent Connected:'
,
team
,
player
print
(
'Agent Connected:'
,
team
,
player
)
self
.
_agentReady
.
add
((
team
,
player
))
else
:
print
'Unhandled message from agent:
%
s'
%
msg
print
(
'Unhandled message from agent:
%
s'
%
msg
)
def
initMsgHandlers
(
self
):
""" Create handlers for different messages. """
...
...
@@ -235,9 +235,9 @@ class Trainer(object):
""" Check that the next message is same as expected message. """
msg
=
self
.
recv
(
retryCount
)
if
msg
!=
expectedMsg
:
print
>>
sys
.
stderr
,
'Error with message'
print
>>
sys
.
stderr
,
' expected:
%
s'
%
expectedMsg
print
>>
sys
.
stderr
,
' received:
%
s'
%
msg
sys
.
stderr
.
write
(
'Error with message'
)
sys
.
stderr
.
write
(
' expected: '
+
expectedMsg
)
sys
.
stderr
.
write
(
' received: '
+
msg
)
# print >>sys.stderr,len(expectedMsg),len(msg)
raise
ValueError
...
...
@@ -263,7 +263,7 @@ class Trainer(object):
self
.
_msgHandlers
.
append
([
args
,
handler
])
else
:
if
(
'quiet'
not
in
kwargs
)
or
(
not
kwargs
[
'quiet'
]):
print
'Updating handler for
%
s'
%
(
' '
.
join
(
args
))
print
(
'Updating handler for
%
s'
%
(
' '
.
join
(
args
)
))
self
.
_msgHandlers
[
i
]
=
[
args
,
handler
]
def
unregisterMsgHandler
(
self
,
*
args
):
...
...
@@ -285,7 +285,7 @@ class Trainer(object):
""" Handle a message using the registered handlers. """
i
,
prefixLength
,
handler
=
self
.
_findHandlerInd
(
msg
)
if
i
<
0
:
print
'Unhandled message:'
,
msg
[
0
:
2
]
print
(
'Unhandled message:'
,
msg
[
0
:
2
])
else
:
handler
(
msg
[
prefixLength
:])
...
...
@@ -319,7 +319,7 @@ class Trainer(object):
def
f
(
body
):
self
.
_gotLook
=
True
del
self
.
_connectedPlayers
[:]
for
i
in
x
range
(
4
,
len
(
body
)):
for
i
in
range
(
4
,
len
(
body
)):
_
,
team
,
num
=
body
[
i
][
0
][:
3
]
if
(
team
,
num
)
not
in
self
.
_connectedPlayers
:
self
.
_connectedPlayers
.
append
((
team
,
num
))
...
...
@@ -342,9 +342,9 @@ class Trainer(object):
def
sendHFOConfig
(
self
):
""" Broadcast the HFO configuration """
offense_nums
=
' '
.
join
([
str
(
self
.
convertToExtPlayer
(
self
.
_offenseTeamName
,
i
))
for
i
in
x
range
(
1
,
self
.
_numOffense
+
1
)])
for
i
in
range
(
1
,
self
.
_numOffense
+
1
)])
defense_nums
=
' '
.
join
([
str
(
self
.
convertToExtPlayer
(
self
.
_defenseTeamName
,
i
))
for
i
in
x
range
(
self
.
_numDefense
)])
for
i
in
range
(
self
.
_numDefense
)])
self
.
send
(
'(say HFO_SETUP offense_name
%
s defense_name
%
s num_offense
%
d'
\
' num_defense
%
d offense_nums
%
s defense_nums
%
s)'
%
(
self
.
_offenseTeamName
,
self
.
_defenseTeamName
,
...
...
@@ -357,15 +357,15 @@ class Trainer(object):
self
.
_isPlaying
=
True
def
printStats
(
self
):
print
'TotalFrames =
%
i, AvgFramesPerTrial =
%.1
f, AvgFramesPerGoal =
%.1
f'
\
print
(
'TotalFrames =
%
i, AvgFramesPerTrial =
%.1
f, AvgFramesPerGoal =
%.1
f'
\
%
(
self
.
_numFrames
,
self
.
_numFrames
/
float
(
self
.
_numTrials
)
if
self
.
_numTrials
>
0
else
float
(
'nan'
),
self
.
_numGoalFrames
/
float
(
self
.
_numGoals
)
if
self
.
_numGoals
>
0
else
float
(
'nan'
))
print
'Trials :
%
i'
%
self
.
_numTrials
print
'Goals :
%
i'
%
self
.
_numGoals
print
'Defense Captured :
%
i'
%
self
.
_numBallsCaptured
print
'Balls Out of Bounds:
%
i'
%
self
.
_numBallsOOB
print
'Out of Time :
%
i'
%
self
.
_numOutOfTime
self
.
_numGoalFrames
/
float
(
self
.
_numGoals
)
if
self
.
_numGoals
>
0
else
float
(
'nan'
))
)
print
(
'Trials :
%
i'
%
self
.
_numTrials
)
print
(
'Goals :
%
i'
%
self
.
_numGoals
)
print
(
'Defense Captured :
%
i'
%
self
.
_numBallsCaptured
)
print
(
'Balls Out of Bounds:
%
i'
%
self
.
_numBallsOOB
)
print
(
'Out of Time :
%
i'
%
self
.
_numOutOfTime
)
def
checkLive
(
self
,
necProcesses
):
"""Returns true if each of the necessary processes is still alive and
...
...
@@ -374,7 +374,7 @@ class Trainer(object):
"""
for
p
,
name
in
necProcesses
:
if
p
is
not
None
and
p
.
poll
()
is
not
None
:
print
'Something necessary closed (
%
s), exiting'
%
name
print
(
'Something necessary closed (
%
s), exiting'
%
name
)
return
False
return
True
...
...
@@ -391,7 +391,7 @@ class Trainer(object):
# Launch offense
agent_num
=
0
for
player_num
in
x
range
(
1
,
12
):
for
player_num
in
range
(
1
,
12
):
if
agent_num
<
self
.
_offenseAgents
and
player_num
==
sorted_offense_agent_unums
[
agent_num
]:
port
=
self
.
_agentServerPort
+
agent_num
agent
=
self
.
launch_agent
(
agent_num
,
sorted_offense_agent_unums
[
agent_num
],
...
...
@@ -410,7 +410,7 @@ class Trainer(object):
# Launch defense
agent_num
=
0
for
player_num
in
x
range
(
1
,
12
):
for
player_num
in
range
(
1
,
12
):
if
agent_num
<
self
.
_defenseAgents
and
player_num
==
sorted_defense_agent_unums
[
agent_num
]:
port
=
self
.
_agentServerPort
+
agent_num
+
self
.
_offenseAgents
agent
=
self
.
launch_agent
(
agent_num
,
sorted_defense_agent_unums
[
agent_num
],
...
...
@@ -427,23 +427,23 @@ class Trainer(object):
else
:
self
.
disconnectPlayer
(
player
,
player_num
,
on_offense
=
False
)
print
'Checking all players connected'
print
(
'Checking all players connected'
)
while
not
self
.
allPlayersConnected
():
self
.
getConnectedPlayers
()
time
.
sleep
(
0.1
)
self
.
sendHFOConfig
()
print
'Starting game'
print
(
'Starting game'
)
time
.
sleep
(
0.1
)
self
.
startGame
()
while
self
.
allPlayersConnected
()
and
self
.
checkLive
(
necProcesses
)
and
not
self
.
_done
:
prevFrame
=
self
.
_frame
self
.
listenAndProcess
()
except
TimeoutError
:
print
'Haven
\'
t heard from the server for too long, Exiting'
print
(
'Haven
\'
t heard from the server for too long, Exiting'
)
except
(
KeyboardInterrupt
,
DoneError
):
print
'Finished'
print
(
'Finished'
)
finally
:
try
:
self
.
_comm
.
sendMsg
(
'(bye)'
)
...
...
example/communication_agent.py
View file @
b7af2fe4
...
...
@@ -24,7 +24,7 @@ def main():
msg
=
hfo
.
hear
()
# Print the incoming communication
if
msg
:
print
(
'Heard:
%
s'
%
msg
)
print
(
(
'Heard:
%
s'
%
msg
)
)
# Take an action
hfo
.
act
(
DASH
,
20.0
,
0.
)
# Create outgoing communication
...
...
@@ -32,7 +32,7 @@ def main():
# Advance the environment and get the game status
status
=
hfo
.
step
()
# Check the outcome of the episode
print
(
'Episode
%
d ended with
%
s'
%
(
episode
,
hfo
.
statusToString
(
status
)))
print
(
(
'Episode
%
d ended with
%
s'
%
(
episode
,
hfo
.
statusToString
(
status
)
)))
# Quit if the server goes down
if
status
==
SERVER_DOWN
:
hfo
.
act
(
QUIT
)
...
...
example/hfo_example_agent.py
View file @
b7af2fe4
...
...
@@ -25,7 +25,7 @@ def main():
# Advance the environment and get the game status
status
=
hfo
.
step
()
# Check the outcome of the episode
print
(
'Episode
%
d ended with
%
s'
%
(
episode
,
hfo
.
statusToString
(
status
)))
print
(
(
'Episode
%
d ended with
%
s'
%
(
episode
,
hfo
.
statusToString
(
status
)
)))
# Quit if the server goes down
if
status
==
SERVER_DOWN
:
hfo
.
act
(
QUIT
)
...
...
example/high_level_random_agent.py
View file @
b7af2fe4
...
...
@@ -28,7 +28,7 @@ def main():
# Advance the environment and get the game status
status
=
hfo
.
step
()
# Check the outcome of the episode
print
(
'Episode
%
d ended with
%
s'
%
(
episode
,
hfo
.
statusToString
(
status
)))
print
(
(
'Episode
%
d ended with
%
s'
%
(
episode
,
hfo
.
statusToString
(
status
)
)))
# Quit if the server goes down
if
status
==
SERVER_DOWN
:
hfo
.
act
(
QUIT
)
...
...
hfo/hfo.py
View file @
b7af2fe4
...
...
@@ -7,7 +7,7 @@ hfo_lib = cdll.LoadLibrary(os.path.join(os.path.dirname(__file__),
'libhfo_c.so'
))
''' Possible feature sets '''
LOW_LEVEL_FEATURE_SET
,
HIGH_LEVEL_FEATURE_SET
=
range
(
2
)
LOW_LEVEL_FEATURE_SET
,
HIGH_LEVEL_FEATURE_SET
=
list
(
range
(
2
)
)
''' An enum of the possible HFO actions
[Low-Level] Dash(power, relative_direction)
...
...
@@ -26,7 +26,7 @@ LOW_LEVEL_FEATURE_SET, HIGH_LEVEL_FEATURE_SET = range(2)
NOOP(): Do Nothing
QUIT(): Quit the game '''
DASH
,
TURN
,
TACKLE
,
KICK
,
KICK_TO
,
MOVE_TO
,
DRIBBLE_TO
,
INTERCEPT
,
\
MOVE
,
SHOOT
,
PASS
,
DRIBBLE
,
CATCH
,
NOOP
,
QUIT
,
REDUCE_ANGLE_TO_GOAL
,
MARK_PLAYER
,
DEFEND_GOAL
,
GO_TO_BALL
=
range
(
19
)
MOVE
,
SHOOT
,
PASS
,
DRIBBLE
,
CATCH
,
NOOP
,
QUIT
,
REDUCE_ANGLE_TO_GOAL
,
MARK_PLAYER
,
DEFEND_GOAL
,
GO_TO_BALL
=
list
(
range
(
19
)
)
''' Possible game status
[IN_GAME] Game is currently active
...
...
@@ -36,10 +36,10 @@ DASH, TURN, TACKLE, KICK, KICK_TO, MOVE_TO, DRIBBLE_TO, INTERCEPT, \
[OUT_OF_TIME] Trial has ended due to time limit
[SERVER_DOWN] Server is not alive
'''
IN_GAME
,
GOAL
,
CAPTURED_BY_DEFENSE
,
OUT_OF_BOUNDS
,
OUT_OF_TIME
,
SERVER_DOWN
=
range
(
6
)
IN_GAME
,
GOAL
,
CAPTURED_BY_DEFENSE
,
OUT_OF_BOUNDS
,
OUT_OF_TIME
,
SERVER_DOWN
=
list
(
range
(
6
)
)
''' Possible sides '''
RIGHT
,
NEUTRAL
,
LEFT
=
range
(
-
1
,
2
)
RIGHT
,
NEUTRAL
,
LEFT
=
list
(
range
(
-
1
,
2
)
)
class
Player
(
Structure
):
pass
Player
.
_fields_
=
[
...
...
@@ -104,9 +104,7 @@ class HFOEnvironment(object):
play_goalie: is this player the goalie
record_dir: record agent's states/actions/rewards to this directory
"""
hfo_lib
.
connectToServer
(
self
.
obj
,
feature_set
,
config_dir
,
server_port
,
server_addr
,
team_name
,
play_goalie
,
record_dir
)
hfo_lib
.
connectToServer
(
self
.
obj
,
feature_set
,
config_dir
.
encode
(
'utf-8'
),
server_port
,
server_addr
.
encode
(
'utf-8'
),
team_name
.
encode
(
'utf-8'
),
play_goalie
,
record_dir
.
encode
(
'utf-8'
))
def
getStateSize
(
self
):
""" Returns the number of state features """
return
hfo_lib
.
getStateSize
(
self
.
obj
)
...
...
@@ -130,11 +128,11 @@ class HFOEnvironment(object):
def
say
(
self
,
message
):
""" Transmit a message """
hfo_lib
.
say
(
self
.
obj
,
message
)
hfo_lib
.
say
(
self
.
obj
,
message
.
encode
(
'utf-8'
)
)
def
hear
(
self
):
""" Returns the message heard from another player """
return
hfo_lib
.
hear
(
self
.
obj
)
return
hfo_lib
.
hear
(
self
.
obj
)
.
decode
(
'utf-8'
)
def
playerOnBall
(
self
):
""" Returns a player object who last touched the ball """
...
...
@@ -146,11 +144,11 @@ class HFOEnvironment(object):
def
actionToString
(
self
,
action
):
""" Returns a string representation of an action """
return
hfo_lib
.
actionToString
(
action
)
return
hfo_lib
.
actionToString
(
action
.
decode
(
'utf-8'
)
)
def
statusToString
(
self
,
status
):
""" Returns a string representation of a game status """
return
hfo_lib
.
statusToString
(
status
)
return
hfo_lib
.
statusToString
(
status
.
decode
(
'utf-8'
)
)
def
getUnum
(
self
):
""" Return the uniform number of the agent """
...
...
setup.py
View file @
b7af2fe4
...
...
@@ -3,7 +3,7 @@ import os.path, sys
hfo_c_lib
=
'hfo/libhfo_c.so'
if
not
os
.
path
.
isfile
(
hfo_c_lib
):
print
(
'ERROR: Unable to find required library:
%
s.'
%
(
hfo_c_lib
))
print
(
(
'ERROR: Unable to find required library:
%
s.'
%
(
hfo_c_lib
)
))
sys
.
exit
()
module1
=
Extension
(
'hfo.hfo_c_wrapper'
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment