binding-matlab/gym_http_client.m (133 lines of code) (raw):
classdef gym_http_client < handle
% Matlab Http client for OpenAI gym
properties
remote_base
end
properties (SetAccess = private)
webopt
end
methods (Access = private)
% Parse a JSON response, and return a (struct) on resp_data
% For more information about using JSON in matlab refer to:
% http://mathworks.com/help/matlab/ref/webread.html
% http://mathworks.com/help/matlab/ref/webwrite.html
function [resp_data] = get_request(obj, route)
url = [obj.remote_base, route];
resp_data = webread(url, obj.webopt);
end
% Encode a JSON message with data described on "req_data", and
% return a response (struct) on resp_data
function [resp_data] = post_request(obj, route, req_data)
url = [obj.remote_base, route];
resp_data = webwrite(url, req_data, obj.webopt);
end
end
methods (Access = public)
% Constructor
function [objInstance] = gym_http_client(remote_base)
objInstance.remote_base = remote_base;
objInstance.webopt = weboptions( ...
'MediaType', 'application/json', ...
'Timeout', 10);
end
function [resp_data] = env_create(obj, env_id)
route = '/v1/envs/';
req_data = struct('env_id',env_id);
resp_data = obj.post_request(route, req_data);
resp_data = resp_data.instance_id;
end
function [resp_data] = env_list_all(obj)
route = '/v1/envs/';
resp_data = obj.get_request(route);
resp_data = resp_data.all_envs;
end
function [resp_data] = env_reset(obj, instance_id)
route = ['/v1/envs/', instance_id, '/reset/'];
resp_data = obj.post_request(route, []);
resp_data = resp_data.observation;
end
function [obs, reward, done, info] = env_step(obj, ...
instance_id, action, render)
if ~exist('render', 'var')
render = false;
end
route = ['/v1/envs/', instance_id, '/step/'];
req_data = struct('action', action, 'render', render);
resp_data = obj.post_request(route, req_data);
obs = resp_data.observation;
reward = resp_data.reward;
done = resp_data.done;
info = resp_data.info;
end
function [resp_data] = env_action_space_info(obj, instance_id)
route = ['/v1/envs/', instance_id, '/action_space/'];
resp_data = obj.get_request(route);
resp_data = resp_data.info;
end
function [resp_data] = env_action_space_sample(obj, instance_id)
route = ['/v1/envs/', instance_id, '/action_space/sample'];
resp_data = obj.get_request(route);
resp_data = resp_data.action;
end
function [resp_data] = env_action_space_contains(obj, instance_id, x)
route = ['/v1/envs/', instance_id, ...
'/action_space/contains/', num2str(x)];
resp_data = obj.get_request(route);
resp_data = resp_data.member;
end
function [resp_data] = env_observation_space_info(obj, instance_id)
route = ['/v1/envs/', instance_id, '/observation_space/'];
resp_data = obj.get_request(route);
resp_data = resp_data.info;
end
function env_monitor_start(obj, ...
instance_id, directory, varargin)
if nargin > 3
if nargin == 4
force = varargin{1};
resume = false;
else
force = varargin{1};
resume = varargin{2};
end
else
force = false;
resume = false;
end
req_data = struct( ...
'directory', directory, ...
'force', force, ...
'resume', resume);
route = ['/v1/envs/', instance_id, '/monitor/start/'];
obj.post_request(route, req_data);
end
function env_monitor_close(obj, instance_id)
route = ['/v1/envs/', instance_id, '/monitor/close/'];
obj.post_request(route, []);
end
function upload(obj, ...
training_dir, varargin)
if nargin > 3
if nargin == 4
api_key = varargin{1};
algorithm_id = '';
end
if nargin == 5
api_key = varargin{1};
algorithm_id = varargin{2};
end
else
api_key = getenv('OPENAI_GYM_API_KEY');
algorithm_id = '';
end
req_data = struct('training_dir',training_dir,...
'algorithm_id',algorithm_id,'api_key',api_key);
route = '/v1/upload/';
obj.post_request(route, req_data);
end
function shutdown_server(obj)
route = '/v1/shutdown/';
obj.post_request(route, []);
end
end
end