0001 function [obj_id, extra_out] = eidors_obj(type,name, varargin )
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 if nargin==0 || ~ischar(type)
0043 error('cannot call eidors_obj with no arguments');
0044 end
0045
0046 switch type
0047 case 'set'
0048 obj_id= set_obj( name, varargin{:} );
0049 case 'get-cache'
0050 test_install
0051 obj_id = []; extra_out= [];
0052 if status_check(varargin{1})
0053 [obj_id, extra_out] = get_cache_obj( name, varargin{:} );
0054 end
0055
0056 case 'set-cache'
0057 test_install
0058 obj_id= [];
0059 if status_check(varargin{1})
0060 obj_id = set_cache_obj( name, varargin{:} );
0061 end
0062
0063 case 'eidors_version'
0064 obj_id= '3.10beta1+';
0065
0066 case 'eidors_path'
0067 global eidors_objects
0068 obj_id = eidors_objects.eidors_path;
0069
0070 case 'interpreter_version'
0071 obj_id= test_versions;
0072
0073
0074
0075
0076
0077 case 'cache_init'
0078 cache_init;
0079
0080 otherwise
0081 test_install
0082 obj_id= new_obj( type, name, varargin{:} );
0083 end
0084
0085 function ok = status_check(name)
0086 ok = true;
0087 switch cache_status
0088 case 0
0089 ok = false;
0090 case 0.5
0091 dbs = dbstack;
0092 if cache_status(dbs(3).name) == 0
0093 ok = false;
0094 end
0095 if strcmp(dbs(3).name,'cache_shorthand') && cache_status(dbs(5).name) == 0
0096 ok = false;
0097 end
0098 if cache_status(name) == 0
0099 ok = false;
0100 end
0101 end
0102
0103 function on = debug_status_check
0104 on = false;
0105 switch debug_status
0106 case 1
0107 on = true;
0108 case 0.5
0109 dbs = dbstack;
0110 if debug_status(dbs(3).name) == 1
0111 on = true;
0112 end
0113 end
0114
0115
0116 function out = cache_status(fname)
0117 global eidors_objects;
0118 if nargin == 0
0119 try
0120 out = eidors_objects.cache_enable;
0121 catch
0122 out = 1;
0123 end
0124 else
0125 out = ~any(strcmp(eidors_objects.cache_disabled_on,fname));
0126 end
0127
0128
0129 function out = debug_status(fname)
0130 global eidors_objects;
0131 if nargin == 0
0132 try
0133 out = eidors_objects.debug_enable;
0134 catch
0135 out = 0;
0136 end
0137 else
0138 out = ~any(strcmp(eidors_objects.debug_enabled_on,fname));
0139 end
0140
0141
0142 function test_install
0143 global eidors_objects;
0144 if isfield(eidors_objects,'max_cache_size'); return; end
0145 error('EIDORS not correctly started. Did you do ">>run /path/to/eidors/startup"');
0146
0147 function verstr = test_versions;
0148 ver= version; ver(ver=='.')=' ';
0149 ver = sscanf(ver,'%f'); ver=ver(:);
0150
0151
0152 verstr.ver = 1e-3.^(0:length(ver)-1) * ver(:);
0153
0154 if exist('OCTAVE_VERSION') == 5
0155 verstr.isoctave = 1;
0156 else
0157 verstr.isoctave = 0;
0158 end
0159
0160 cptr = computer;
0161 if strcmp(cptr(end+(-1:0)), '64')
0162 verstr.is64bit = 1;
0163 else
0164 verstr.is64bit = 0;
0165 end
0166
0167 function obj = set_obj( obj, varargin );
0168 global eidors_objects;
0169
0170
0171
0172
0173
0174 for idx= 1:2:nargin-1
0175 obj.( varargin{idx} )= varargin{idx+1};
0176 end
0177
0178
0179 function [value, obj_id] = get_cache_obj( obj, prop )
0180 global eidors_objects
0181 DEBUG = eidors_debug('query','eidors_obj');
0182
0183 value= [];
0184 obj_id = [];
0185
0186 if DEBUG, str = sprintf('cache request: %s ',prop); end
0187
0188
0189
0190 if ~isfield(eidors_objects, 'cache')
0191 cache_init;
0192 if DEBUG, fprintf('%s: NO CACHE FIELD\n',str); end
0193 return
0194 end
0195
0196 obj_id= calc_obj_id( { obj, prop} );
0197
0198 if isempty(eidors_objects.cache.meta),
0199 if DEBUG, fprintf('%s: NO META FIELD\n',str); end
0200 return
0201 end
0202 c = eidors_objects.cache.cols;
0203
0204
0205
0206 if DEBUG, str = [str, obj_id]; end
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218 if ~isfield( eidors_objects.cache, obj_id);
0219 if DEBUG, fprintf('%s: not found\n',str); end
0220 return
0221 end
0222
0223 idx = find(strcmp(obj_id, eidors_objects.cache.meta(:,c.obj_id)), 1, 'first');
0224 if DEBUG && isempty(idx), fprintf('%s: EMPTY IDX !!\n',str); end
0225 if ~isempty(idx)
0226 eidors_objects.cache.meta{idx,c.time} = now;
0227 eidors_objects.cache.meta{idx,c.count} = eidors_objects.cache.meta{idx,c.count} + 1;
0228 eidors_objects.cache.meta{idx,c.score_eff} = calc_effort_score(...
0229 eidors_objects.cache.meta{idx,c.effort}, ...
0230 eidors_objects.cache.meta{idx,c.count}, ...
0231 eidors_objects.cache.meta{idx,c.prio});
0232 end
0233 value = eidors_objects.cache.(obj_id);
0234 if DEBUG, fprintf('%s: found\n',str); end
0235
0236
0237
0238
0239
0240 function obj_id = set_cache_obj( obj, prop, value, time )
0241 global eidors_objects
0242 obj_id = [];
0243
0244 if ~cache_this( obj ) ; return ; end
0245
0246 if nargin < 4
0247 time = 1;
0248 end
0249
0250 if ~isfield(eidors_objects,'cache');
0251 init_cache;
0252 end
0253
0254 c = eidors_objects.cache.cols;
0255
0256
0257
0258
0259 obj_id = calc_obj_id( {obj, prop} );
0260
0261 prio = eidors_objects.cache_priority;
0262
0263
0264
0265 ws = whos('value');
0266 row(c.obj_id) = {obj_id};
0267 row(c.prop) = {prop};
0268 row(c.size) = {ws.bytes};
0269 row(c.score_sz) = {calc_size_score(ws.bytes)};
0270 row(c.effort) = {time};
0271 row(c.prio) = {prio};
0272 row(c.count) = {1};
0273 row(c.score_eff)= {calc_effort_score(time, 1, prio)};
0274 row(c.time) = {now};
0275
0276 if isfield(eidors_objects.cache, obj_id)
0277 idx = find(strcmp(obj_id, eidors_objects.cache.meta(:,c.obj_id)));
0278 eidors_msg('@@ replaced cache object %s { %s }', obj_id, prop,4);
0279 eidors_objects.cache.size = eidors_objects.cache.size ...
0280 - eidors_objects.cache.meta{idx,c.size};
0281
0282 else
0283 idx = size(eidors_objects.cache.meta, 1) + 1;
0284 end
0285 eidors_objects.cache.meta(idx,:) = row;
0286 eidors_objects.cache.( obj_id ) = value;
0287 eidors_objects.cache.size = eidors_objects.cache.size + ws.bytes;
0288 check_size(obj_id, prop);
0289
0290
0291
0292
0293
0294 function cache_init
0295 global eidors_objects;
0296
0297 eidors_objects.cache = struct;
0298 eidors_objects.cache.meta = cell(0);
0299 eidors_objects.cache.cols.obj_id = 1;
0300 eidors_objects.cache.cols.prop = 2;
0301 eidors_objects.cache.cols.time = 3;
0302 eidors_objects.cache.cols.size = 4;
0303 eidors_objects.cache.cols.score_sz = 5;
0304 eidors_objects.cache.cols.effort = 6;
0305 eidors_objects.cache.cols.prio = 7;
0306 eidors_objects.cache.cols.count = 8;
0307 eidors_objects.cache.cols.score_eff = 9;
0308 eidors_objects.cache.size = 0;
0309
0310 function score = calc_size_score(sz)
0311 if iscell(sz)
0312 fn = @(b) round(10*log10(b / 1024));
0313 N = numel(sz);
0314 score = num2cell(cellfun(fn, sz));
0315 else
0316 score = round(10 * log10( sz / 1024));
0317 end
0318
0319 function score = calc_effort_score( time, counts, prios)
0320 if iscell(time)
0321 score = num2cell( round(10*log10( cell2mat(time) .* cell2mat(counts))) +...
0322 cell2mat(prios));
0323 else
0324 score = round(10*log10(time .* counts)) + prios;
0325 end
0326
0327
0328 function obj= new_obj( type, name, varargin );
0329 global eidors_objects
0330
0331 if isstruct(name)
0332 obj= name;
0333 try
0334 name= obj.name;
0335 catch
0336 name= 'unknown';
0337 end
0338 end
0339
0340 obj.type = type;
0341 obj.name = name;
0342 obj= set_obj(obj, varargin{:} );
0343
0344
0345
0346
0347
0348 function obj_id= calc_obj_id( var )
0349 try
0350 obj_id= eidors_var_id( var );
0351 catch
0352 global eidors_objects;
0353 if ~isfield(eidors_objects,'hash_type')
0354 eidors_objects.hash_type= 1e8+1;
0355 end
0356
0357 obj_id= sprintf('id_%031d%08d', 0,eidors_objects.hash_type );
0358 eidors_objects.hash_type= eidors_objects.hash_type + 1;
0359 end
0360
0361
0362
0363
0364
0365
0366
0367 function test_for_cachdir
0368 global eidors_objects;
0369 if ~isfield(eidors_objects, 'cachedir')
0370 cachedir= 'eidors_cache';
0371 eidors_objects.cachedir= [pwd,'/',cachedir];
0372
0373 if ~exist( eidors_objects.cachedir, 'dir')
0374
0375
0376
0377 mkdir(pwd,cachedir);
0378 end
0379 end
0380
0381
0382
0383
0384 function [objlist, cachedir]= proc_obj_list( varargin );
0385 cachedir= [];
0386 if nargin==0
0387 objlist= {};
0388 elseif ischar(varargin{nargin})
0389 cachedir= varargin{nargin};
0390 objlist = varargin(1:nargin-1);
0391 else
0392 objlist = varargin(:);
0393 end
0394
0395 function retval= cache_this( obj )
0396
0397
0398
0399 if ~isstruct( obj); retval=1; return; end
0400 DONT_CACHE= {'data','image'};
0401 if any(strcmp( obj.type, DONT_CACHE));
0402 retval = 0;
0403 else
0404 retval = 1;
0405 end
0406
0407 function check_size( obj_id , prop )
0408 global eidors_objects;
0409
0410
0411 max_memory= eidors_objects.max_cache_size;
0412
0413 if eidors_objects.cache.size > max_memory
0414 eidors_cache('clear_max',floor(max_memory*.75));
0415 end
0416