Mercurial > hg > ltpda
diff m-toolbox/test/aorepo_proto_test/UTN_repo_test_func.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/test/aorepo_proto_test/UTN_repo_test_func.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,382 @@ +function varargout = UTN_repo_test_func(varargin) + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % DESCRIPTION: UTN_REPO_TEST_FUNC Tests the submit and retrieve of LTPDA objs in + % the AEI LTPDA database, from UTN, measuring the submit/retrieve time. + % + % CALL: s = UTN_repo_test_func(pl) + % + % INPUTS: pl - parameter list(s) + % + % OUTPUTS: s - a struct containing the results of the test. In detail: + % + % ret_time - time for retrieval (s) + % sub_time - time for submission (s) + % t - absolute time of test execution + % test_ID - test identifier, also repeated in saved file + % status - result of comparison between submitted and + % retrieved objs + % OBJids - submitted objs IDs assigned by database + % cid - submitted objs collection ID assigned by database + % start_time - beginning time of test execution + % stop_time - ending time of test execution + % obj_size - length (in s) of submitted tsdata AO (if applicable) + % sinfo - a struct with infos about the connection + % + % PARAMETER LIST: + % <key> <default value> <description> + % 'N_OBJ' 1 produces N_OBJ objects at a time. + % Insert 0 for random number of objects + % 'OBJ_TYPE 'ao' defines the object(s) to produce + % If empty or 'RAND', it will pick at random within + % the ltpda_uo class + % 'NSECS' 100 sets time series lenght for aos + % 'FS' 10 sets time series sampling frequency for aos + % 'SUBMIT' false actually performs the submit/retrieve test + % 'CONN' empty a conn struct if the connection was + % already open (for group tests) + % 'HOSTNAME' '130.75.117.67' the repository host IP (for individual tests) + % 'DBASE' 'ltpda_test' the database name (for individual tests) + % 'COLL_RETRIEVE' false retrieves via the submitted collection ID + % 'SAVE_OBJS' false saves the first produced obj + % 'OBJ_FILENAME' 'submit_trial_ao.xml' filename to save first produced obj + % 'SAVE_RESULTS' true saves the individual test results + % 'RESULTS_FILENAME' 'repo_test_UTN' filename to save results in + % + % VERSION: $Id: UTN_repo_test_func.m,v 1.14 2008/11/18 17:29:40 mauro Exp $ + % + % HISTORY: 23-11-2007 M Hueller + % Creation + % 18-11-2008 M Hueller + % Formatted for OO toolbox + % Default plist extended + % + % M-FILE INFO: Get information about this methods by calling + % >> ao.getInfo('UTN_repo_test_func') + % + % Get information about a specified set-plist by calling: + % >> ao.getInfo('UTN_repo_test_func', 'None') + % + % SEE ALSO: run_UTN_repo_test + % + % SEE: <a href="matlab: help ao/Contents;">HELP: All Analysis Object Functions:</a> + % <a href="matlab: helpwin ao/Contents;">DOC: All Analysis Object Functions:</a> + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + %% Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + varargout{1} = getInfo(varargin{3}); + return + end + + % Collect input variable names + in_names = cell(size(varargin)); + for ii = 1:nargin + in_names{ii} = inputname(ii); + end + + % Collect all plists + pls = utils.helper.collect_objects(varargin(:), 'plist', in_names); + + %% ---------------- Produce one plist + if isa(pls, 'plist') + pls = combine(pls, getDefaultPL()); + else + pls = getDefaultPL(); + end + + + %% ---------------- Gathers the settings + % Number of submitted objects during the test + N_OBJ = find(pls, 'N_OBJ'); + + if N_OBJ < 1 + % Pick a random rumber between 1 and 5 + N_OBJ = randsample(5,1); + end + + % Collects the conn struct. If empty, the test is individual, with + % connection opened and closed + conn = find(pls, 'conn'); + if isempty(conn) + single_conn = true; + else + single_conn = false; + end + + %% Builds the trial objects + + objs = {}; + obj_type = find(pls, 'obj_type'); + user_class_list = utils.helper.ltpda_userclasses; + + if strcmpi(obj_type, 'RAND') || isempty(obj_type) + % Empty class name or explicitely asked random value + rand_type = true; + else + % Checks if user entered a user class name + chk_ind = false; + for kk = 1:length(user_class_list) + if strcmpi(user_class_list{kk}, obj_type) + chk_ind = true; + end + end + + % Invalid class name, go for random + if ~chk_ind + disp('Invalid object type, picking up random') + rand_type = true; + else + rand_type = false; + end + end + + for kk = 1:N_OBJ + if rand_type + % Picks up at random one user class name + index = ceil(length(user_class_list)*rand(1)); + obj_type = user_class_list{index}; + end + + % Test ID based on time elapsed since a reference time + ref_time = time('2008-01-01 00:00:00'); + test_ID = floor(time - ref_time); + + switch obj_type + case 'ao' + % Makes the trial object(s) + nsecs = find(pls, 'NSECS'); + fs = find(pls, 'FS'); + f_m = 0.01; + phi = 0; + noise_type = 'Normal'; + + pl_w = plist('fs', fs, 'nsecs', nsecs, ... + 'waveform', 'sine wave','f', f_m, 'phi', phi, 'test_ID', test_ID); + pl_n = plist('fs', fs, 'nsecs', nsecs, ... + 'waveform', 'noise', 'type', noise_type, 'test_ID', test_ID); + + % Puts the trial object(s) in a cell array + objs{kk} = ao(pl_w) + ao(pl_n); + + case 'plist' + % Puts the trial object(s) in a cell array + objs{kk} = plist('a', 'val', 'b', 3); + + case 'mfir' + pl_f = plist('type', 'lowpass', 'order', 1, 'gain', 2.0, ... + 'fs', 10, 'fc', 0.2); + % Puts the trial object(s) in a cell array + objs{kk} = mfir(pl_f); + + case 'miir' + pl_f = plist('type', 'lowpass', 'order', 1, 'gain', 2.0, ... + 'fs', 10, 'fc', 0.2); + % Puts the trial object(s) in a cell array + objs{kk} = miir(pl_f); + + case 'pzmodel' + pl_pzm = plist('gain', 1, ... + 'poles', [pz(1) pz(2,10)], 'zeros', [pz(4.3)]); + % Puts the trial object(s) in a cell array + objs{kk} = pzmodel(pl_pzm); + + case 'timespan' + t1 = time(); + % Puts the trial object(s) in a cell array + objs{kk} = timespan(t1, t1 + 100); + + case 'ssm' + pl_ssm = plist('built-in', 'Interferometer_readout'); + % Puts the trial object(s) in a cell array + objs{kk} = ssm(pl_ssm); + + case 'parfrac' + % A small example from help + % Puts the trial object(s) in a cell array + % objs{kk} = parfrac([1 2], {4, [6 2]}, []); + disp('For the time being, use a timespan obj rather than parfrac') + t1 = time(); + objs{kk} = timespan(t1, t1 + 100); + + case 'rational' + % A small example from help + % Puts the trial object(s) in a cell array + % objs{kk} = rational([1 2], [6 2]); + disp('For the time being, use a timespan obj rather than rational') + t1 = time(); + objs{kk} = timespan(t1, t1 + 100); + + otherwise + disp(['Object ' obj_type ' not coded already, use timespan instead']) + t1 = time(); + % Puts the trial object(s) in a cell array + objs{kk} = timespan(t1, t1 + 100); + end + end + + + %% Executes the submit/retrieve test + if find(pls, 'SUBMIT') + + start_time = now; + + disp(' ') + disp(sprintf('*===== Test %d =========', test_ID)) + disp(' ') + + % Connection + if single_conn + + % Get the hostname + hostname = find(pls, 'hostname'); + + % Get the database name + database_name = find(pls, 'dbase'); + + % Opens the connection + conn = utils.mysql.connect(hostname, database_name); + end + + % Submission and retrieval + results = submitretrieve(conn, objs, test_ID, find(pls, 'coll_retrieve')); + + if single_conn + % Close connection + close(conn); + end + + % Includes time for start and stop in serial form + stop_time = now; + results.start = start_time; + results.stop = stop_time; + if exist('fs','var') && exist('nsecs','var') + results.obj_size = nsecs * fs; + else + results.obj_size = 0; + end + + if find(pls, 'save_results') + % Saves the test results + save([find(pls,'results_filename') '_' num2str(test_ID) '.mat'], 'results'); + end + + varargout{1} = results; + else + varargout{1} = struct(); + end + + %% Saves on disk the first trial data object, for future comparison + if find(pls,'save_objs') + save(objs{1}, find(pls,'obj_filename')); + end +end + +%-------------------------------------------------------------------------- +% Executes the submit/receive actions +%-------------------------------------------------------------------------- +function sr_report = submitretrieve(conn, sub_obj, test_ID, coll_retr) + + % Get the current time + t1 = char(time()); + + % Put togehter the information struct + sinfo.conn = conn; + sinfo.username = conn.username; + sinfo.experiment_title = ['Repository Test from UTN ' t1(1:10)]; + sinfo.experiment_description = sprintf('Submit/retrieve test # %d', test_ID); + sinfo.analysis_description = 'Nothing serious, just playing with submit and retrieve'; + sinfo.quantity = 'none'; + sinfo.keywords = 'none'; + sinfo.reference_ids = ''; + sinfo.additional_comments = 'Trial data for submission and retrieval'; + sinfo.additional_authors = 'M Hewitson'; + + + % Submit the object + tic; + [OBJids, cid] = submit(sub_obj{:}, sinfo); + st = toc; + + % Retrieve the object(s) + if coll_retr + % Retrieve the object(s) by collection ID + disp(['Retrieve object with collection ID ' num2str(cid)]); + tic; + ret_obj = ltpda_uo.retrieve(conn, 'Collection', cid); + else + % retrieve the object(s) by obj IDs + disp(['Retrieve object with obj ID ' num2str(OBJids)]); + tic; + ret_obj = ltpda_uo.retrieve(conn, OBJids); + end + + % Single retrieval will give an object, not a cell array + if ~isa(ret_obj, 'cell') + ret_obj = {ret_obj}; + end + rt = toc; + + + % Check consistency of retrieved/submitted object(s) + status = zeros(1,length(sub_obj)); + + for kk = 1:length(sub_obj) + status(kk) = status(kk) + ne(sub_obj{kk}, ret_obj{kk}, 'invars', 'hist'); + end + + % Build a report struct + sr_report.ret_time = rt; + sr_report.sub_time = st; + sr_report.t = t1(1:19); % Skip milliseconds + sr_report.t(strfind(sr_report.t,':')) = '_'; % These are correct fieldnames + sr_report.test_ID = test_ID; + sr_report.status = status; + sr_report.OBJids = OBJids; + sr_report.cid = cid; + sr_report.sinfo = rmfield(sinfo, 'conn'); % Remove the non-serializable substructs +end + +%-------------------------------------------------------------------------- +% Get Info Object +%-------------------------------------------------------------------------- +function ii = getInfo(varargin) + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + else + sets = {'Default'}; + pl = getDefaultPlist; + end + % Build info object + ii = minfo(mfilename, 'ao', '', utils.const.categories.helper, '$Id: UTN_repo_test_func.m,v 1.14 2008/11/18 17:29:40 mauro Exp $', sets, pl); +end + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- +function plo = getDefaultPlist() + + disp('* creating default plist...'); + plo = plist('RAND', false, ... + 'OBJ_TYPE', 'ao', ... + 'N_OBJ', 1, ... + 'NSECS', 100, ... + 'FS', 10, ... + 'SAVE_OBJS', false, ... + 'OBJ_FILENAME', 'submit_trial_ao.xml', ... + 'SUBMIT', false, ... + 'HOSTNAME', '130.75.117.67', ... + 'DBASE', 'ltpda_test', ... + 'CONN', [], ... + 'COLL_RETRIEVE', false, ... + 'SAVE_RESULTS', true, ... + 'RESULTS_FILENAME', 'repo_test_UTN'); + + disp('* done.'); +end + +% END