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
869f1719
Commit
869f1719
authored
Jul 07, 2017
by
drallensmith
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Testing scripts created; travis likely headache...
parent
bdc7504c
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
137 additions
and
9 deletions
+137
-9
hfo/hfo.py
hfo/hfo.py
+6
-3
src/lowlevel_feature_extractor.cpp
src/lowlevel_feature_extractor.cpp
+6
-6
tests/test_basic.py
tests/test_basic.py
+13
-0
tests/test_with_server.py
tests/test_with_server.py
+112
-0
No files found.
hfo/hfo.py
View file @
869f1719
...
...
@@ -7,7 +7,8 @@ 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
=
list
(
range
(
2
))
NUM_FEATURE_SETS
=
2
LOW_LEVEL_FEATURE_SET
,
HIGH_LEVEL_FEATURE_SET
=
list
(
range
(
NUM_FEATURE_SETS
))
''' An enum of the possible HFO actions
[Low-Level] Dash(power, relative_direction)
...
...
@@ -25,8 +26,9 @@ LOW_LEVEL_FEATURE_SET, HIGH_LEVEL_FEATURE_SET = list(range(2))
[High-Level] Catch(): Catch the ball (Goalie Only)
NOOP(): Do Nothing
QUIT(): Quit the game '''
NUM_HFO_ACTIONS
=
19
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
=
list
(
range
(
19
))
MOVE
,
SHOOT
,
PASS
,
DRIBBLE
,
CATCH
,
NOOP
,
QUIT
,
REDUCE_ANGLE_TO_GOAL
,
MARK_PLAYER
,
DEFEND_GOAL
,
GO_TO_BALL
=
list
(
range
(
NUM_HFO_ACTIONS
))
''' Possible game status
[IN_GAME] Game is currently active
...
...
@@ -36,7 +38,8 @@ 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
=
list
(
range
(
6
))
NUM_GAME_STATUS_STATES
=
6
IN_GAME
,
GOAL
,
CAPTURED_BY_DEFENSE
,
OUT_OF_BOUNDS
,
OUT_OF_TIME
,
SERVER_DOWN
=
list
(
range
(
NUM_GAME_STATUS_STATES
))
''' Possible sides '''
RIGHT
,
NEUTRAL
,
LEFT
=
list
(
range
(
-
1
,
2
))
...
...
src/lowlevel_feature_extractor.cpp
View file @
869f1719
...
...
@@ -193,13 +193,13 @@ const std::vector<float>& LowLevelFeatureExtractor::ExtractFeatures(
PlayerObject
*
teammate
=
*
it
;
if
(
teammate
->
pos
().
x
>
0
&&
teammate
->
unum
()
>
0
&&
detected_teammates
<
numTeammates
)
{
addFeature
(
teammate
->
unum
());
addFeature
(
teammate
->
unum
()
/
100.0
);
detected_teammates
++
;
}
}
// Add
zero
features for any missing teammates
// Add
-2
features for any missing teammates
for
(
int
i
=
detected_teammates
;
i
<
numTeammates
;
++
i
)
{
addFeature
(
0
);
addFeature
(
FEAT_MIN
);
}
detected_opponents
=
0
;
...
...
@@ -208,13 +208,13 @@ const std::vector<float>& LowLevelFeatureExtractor::ExtractFeatures(
PlayerObject
*
opponent
=
*
it
;
if
(
opponent
->
pos
().
x
>
0
&&
opponent
->
unum
()
>
0
&&
detected_opponents
<
numOpponents
)
{
addFeature
(
opponent
->
unum
());
addFeature
(
opponent
->
unum
()
/
100.0
);
detected_opponents
++
;
}
}
// Add
zero
features for any missing opponents
// Add
-2
features for any missing opponents
for
(
int
i
=
detected_opponents
;
i
<
numOpponents
;
++
i
)
{
addFeature
(
0
);
addFeature
(
FEAT_MIN
);
}
assert
(
featIndx
==
numFeatures
);
...
...
tests/test_basic.py
0 → 100755
View file @
869f1719
"""Very basic tests, only of functions available sans server"""
#from __future__ import print_function
import
hfo
hfo_env
=
hfo
.
HFOEnvironment
()
for
action
in
range
(
hfo
.
NUM_HFO_ACTIONS
):
assert
len
(
hfo_env
.
actionToString
(
action
))
for
state
in
range
(
hfo
.
NUM_GAME_STATUS_STATES
):
assert
len
(
hfo_env
.
statusToString
(
state
))
tests/test_with_server.py
0 → 100755
View file @
869f1719
"""A few tests using a server"""
from
__future__
import
print_function
import
os
import
subprocess
import
sys
import
time
import
hfo
test_dir
=
os
.
path
.
dirname
(
os
.
path
.
abspath
(
os
.
path
.
realpath
(
__file__
)))
binary_dir
=
os
.
path
.
normpath
(
test_dir
+
"/../bin"
)
conf_dir
=
os
.
path
.
join
(
binary_dir
,
'teams/base/config/formations-dt'
)
bin_HFO
=
os
.
path
.
join
(
binary_dir
,
"HFO"
)
popen_list
=
[
sys
.
executable
,
"-x"
,
bin_HFO
,
"--offense-agents=1"
,
"--defense-npcs=2"
,
"--offense-npcs=2"
,
"--trials=1"
,
"--headless"
]
HFO_process
=
subprocess
.
Popen
(
popen_list
)
hfo_env
=
hfo
.
HFOEnvironment
()
time
.
sleep
(
0.2
)
assert
(
HFO_process
.
poll
()
is
None
),
"Failed to start HFO with command '{}'"
.
format
(
" "
.
join
(
popen_list
))
time
.
sleep
(
3
)
def
try_step
():
# if a game ends within ~20 frames, something is wrong...
status
=
hfo_env
.
step
()
assert
(
status
==
hfo
.
IN_GAME
),
(
"Status is {!s} ({!r}), not IN_GAME"
.
format
(
hfo_env
.
statusToString
(
status
),
status
))
return
hfo_env
.
getState
()
try
:
hfo_env
.
connectToServer
(
config_dir
=
conf_dir
)
# using defaults otherwise
min_state_size
=
58
+
(
9
*
4
)
state_size
=
hfo_env
.
getStateSize
()
assert
(
state_size
>=
min_state_size
),
"State size is {!s}, not {!s}+"
.
format
(
state_size
,
min_state_size
)
print
(
"State size is {!s}"
.
format
(
state_size
))
my_unum
=
hfo_env
.
getUnum
()
assert
((
my_unum
>
0
)
and
(
my_unum
<=
11
)),
"Wrong self uniform number ({!r})"
.
format
(
my_unum
)
print
(
"My unum is {!s}"
.
format
(
my_unum
))
had_ok_unum
=
False
had_ok_unum_set_my_side
=
set
()
had_ok_unum_set_their_side
=
set
();
hfo_env
.
act
(
hfo
.
NOOP
)
state
=
try_step
()
for
x
in
range
(
0
,
20
):
if
int
(
state
[
12
])
==
1
:
# can kick the ball
hfo_env
.
act
(
hfo
.
DRIBBLE
)
elif
(
x
%
2
)
!=
0
:
hfo_env
.
act
(
hfo
.
MOVE
)
elif
int
(
state
[
50
])
==
1
:
# can see the ball
hfo_env
.
act
(
hfo
.
GO_TO_BALL
)
else
:
hfo_env
.
act
(
hfo
.
MOVE
)
state
=
try_step
()
for
n
in
range
((
state_size
-
4
),
state_size
):
their_unum
=
state
[
n
]
if
((
their_unum
>
0
)
and
(
their_unum
<=
0.11
)):
print
(
"{!s}: OK uniform number ({!r}) for {!s}"
.
format
(
x
,
their_unum
,
n
))
had_ok_unum
=
True
if
n
>
(
state_size
-
3
):
had_ok_unum_set_their_side
.
add
(
their_unum
)
else
:
had_ok_unum_set_my_side
.
add
(
their_unum
)
elif
x
>
3
:
print
(
"{!s}: Wrong other uniform number ({!r}) for {!s}"
.
format
(
x
,
their_unum
,
n
))
if
(
len
(
had_ok_unum_set_my_side
)
>
1
)
and
(
len
(
had_ok_unum_set_their_side
)
>
1
):
break
assert
had_ok_unum
,
"Never saw OK other uniform number"
try
:
hfo_env
.
act
(
hfo
.
MOVE_TO
)
except
AssertionError
:
pass
else
:
raise
AssertionError
(
"Should have got AssertionError"
)
HFO_process
.
terminate
()
hfo_env
.
act
(
hfo
.
QUIT
)
time
.
sleep
(
1.2
)
status
=
hfo_env
.
step
()
assert
(
status
==
hfo
.
SERVER_DOWN
),
(
"Status is {!s} ({!r}), not SERVER_DOWN"
.
format
(
hfo_env
.
statusToString
(
status
),
status
))
finally
:
if
HFO_process
.
poll
()
is
None
:
HFO_process
.
terminate
()
os
.
system
(
"killall -9 rcssserver"
)
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