def put_matlab(folder, properties, file_name, uid, extra_code_generator=None, not_use=DEFAULT_NOT_USE_PROPERTIES, quiet=True, zero_based_num=0): matlab_lines = [] uid = uid.replace('-', 'm') def can_use(key): for bad_key in not_use: if re.match(bad_key, key): return False return True for key in sorted(properties.keys()): if can_use(key): use_key = key.replace('-', '_') if 'task_' in use_key: tag = use_key[:len('task_')+use_key.index('task_')-1] rest = use_key[len(tag)+1:].split('_') use_key = '%s(%d).%s' % (tag, int(rest[0]) + 1, '_'.join(rest[1:])) matlab_lines.append('results.for_%s(%d).%s = %s;' % (uid, zero_based_num+1, use_key, format_for_matlab(string_to_object(properties[key])))) if extra_code_generator is not None: matlab_lines.append(extra_code_generator(folder, properties, file_name, uid, quiet=quiet, zero_based_num=zero_based_num, not_use=not_use)) push_dir(folder) matlab = '\n'.join(matlab_lines) if not quiet and os.path.exists(file_name): input("The file `%s' in `%s' already exists. Press enter to continue, or ^c (ctrl + c) to break." % (file_name, folder)) with open(file_name, 'w') as f: f.write(matlab) pop_dir()
def make_matlab_segment( alphabet_id, alphabet_num, prefix, get_ids, get_extra_info_file_name, get_image_list, get_stroke_list, extra_info_keys=('feedback', 'actual_input_device', 'actual_seen_before', 'age', 'language-read', 'language-read-write', 'native-language', 'comments'), info_types={ 'age': int, 'uids': str }, prefix_sep='_', verbose=True, save_stroke=SAVE_STROKE, make_explicit=MAKE_EXPLICIT): if verbose: print(' Getting alphabet name...') alphabet_name = get_alphabet_name(alphabet_id) rtn = [ '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ', ('%s (%s) - %s' % (alphabet_id, alphabet_name, prefix)), ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n' ] alphabets_list_name = '%s%salphabets(%d)' % (prefix, prefix_sep, alphabet_num) props = { 'alphabets_list_name': alphabets_list_name, 'alphabet_name': alphabet_name } def cur_props(new_props): rtn = props.copy() rtn.update(new_props) return rtn rtn.append( "%(alphabets_list_name)s.name = %(alphabet_name_fixed)s;\n" % cur_props( {'alphabet_name_fixed': format_for_matlab(props['alphabet_name']) })) if verbose: print(' Getting alphabet ids...') uids = get_ids(alphabet_id) if verbose: print(' Getting info names...') extra_info_names = get_extra_info_file_name(alphabet_id=alphabet_id, from_path=os.getcwd()) if verbose: print(' Getting stroke names...') stroke_names = get_stroke_list(alphabet_id=alphabet_id, from_path=os.getcwd()) if verbose: print(' Getting image names...') old_format_image_names = get_image_list(alphabet_id=alphabet_id, from_path=os.getcwd()) if verbose: print(' Getting original image name...') original_images = get_original_image_list(alphabet_id=alphabet_id, from_path=os.getcwd()) extra_infos = {'uids': {}} strokes = [] image_names = [] if verbose: print(' Parsing extra information...') for key in extra_info_keys: extra_infos[key] = {} for uid in uids: with open(extra_info_names[uid], 'r') as f: cur_extra_info = [line.split(': ') for line in f] cur_extra_info = [(line[0], ': '.join(line[1:])) for line in cur_extra_info] for key, value in cur_extra_info: if key not in extra_infos: extra_infos[key] = {} extra_infos[key][uid] = value.strip('\n') extra_infos['uids'][uid] = uid for stroke_num in range(len(stroke_names[uid])): while stroke_num >= len(strokes): strokes.append({}) strokes[stroke_num][uid] = alphabetsutil.get_stroke( stroke_names[uid][stroke_num], parsed=True) ## if "'y':'y':" in strokes[stroke_num][uid]: ## strokes[stroke_num][uid] = strokes[stroke_num][uid].replace("'y':'y':", "'y':") ## with open(stroke_names[uid][stroke_num], 'w') as f: ## f.write(strokes[stroke_num][uid]) for image_num in range(len(old_format_image_names[uid])): while image_num >= len(image_names): image_names.append({}) image_names[image_num][uid] = old_format_image_names[uid][ image_num] # fix extra_infos formatting if verbose: print(' Fixing extra information formatting...') for key in extra_infos: if len(extra_infos[key]) != len(uids): for uid in uids: if uid not in extra_infos[key]: extra_infos[key][uid] = '' if key in info_types: for uid in uids: if extra_infos[key][uid]: extra_infos[key][uid] = info_types[key]( extra_infos[key][uid]) elif info_types[key] is int: extra_infos[key][uid] = None for key in sorted(extra_infos.keys()): rtn.append("%(alphabets_list_name)s.%(key)s = %(value)s;\n" % \ cur_props({'key':key.replace('-', '_'), 'value':format_for_matlab([extra_infos[key][uid] for uid in uids])})) # original images if verbose: print(' Appending original images...') first_part = "%(alphabets_list_name)s.original_images = {\n" % props rtn.append(first_part) spaces = ''.join(' ' for i in first_part) for image_name in original_images: rtn.append("%simread('%s'),...\n" % (spaces, image_name)) rtn.append('%s};\n' % spaces) # results images if verbose: print(' Appending results images...') first_part = "%(alphabets_list_name)s.character_images = {\n" % props rtn.append(first_part) spaces = ''.join(' ' for i in first_part) for image_name_dict in image_names: rtn.append(spaces + '{') rtn.append(', '.join("imread('%s')" % image_name_dict[uid] for uid in uids)) rtn.append('},...\n') rtn.append('%s};\n' % spaces) # make xs, ys, ts xss = [] yss = [] tss = [] if verbose: print(' Parsing and fixing strokes...') for stroke_dict in strokes: xss.append({}) yss.append({}) tss.append({}) for uid in uids: cur_stroke = stroke_dict[uid] xss[-1][uid] = '{' + ', '.join( '[' + ', '.join(str(point['x']) for point in stroke) + ']' for stroke in cur_stroke) + '}' # int8 yss[-1][uid] = '{' + ', '.join( '[-' + ', -'.join(str(point['y']) for point in stroke) + ']' for stroke in cur_stroke) + '}' # int8 tss[-1][uid] = '{' + ', '.join( '[' + ', '.join(str(point['t']) for point in stroke) + ']' for stroke in cur_stroke) + '}' # uint16 stroke_parts = {'xss': xss, 'yss': yss, 'tss': tss} # strokes if verbose: print(' Appending strokes images...') for stroke_name in ('xss', 'yss', 'tss'): first_part = "%(alphabets_list_name)s.character_%(stroke_name)s = {\n" % cur_props( {'stroke_name': stroke_name}) rtn.append(first_part) spaces = ''.join(' ' for i in first_part) for character_strokes in stroke_parts[stroke_name]: rtn.append(spaces + '{\n' + spaces + ' ') rtn.append((spaces + ' ').join(character_strokes[uid] + ',...\n' for uid in uids)) rtn.append(spaces + '},...\n') rtn.append('%s};\n' % spaces) if save_stroke and make_explicit: for character_i in range(len(xss)): for person_i in range(len(xss[character_i])): uid = uids[person_i] new_xs = xss[character_i][uid][1:-1].replace('], [', ', NaN, ') new_ys = yss[character_i][uid][1:-1].replace('], [', ', NaN, ') new_ts = tss[character_i][uid][1:-1].replace('], [', ', NaN, ') rtn.append("%(alphabets_list_name)s.character_xss{%(character_i)d}{%(person_i)d} = %(new_stroke)s;\n" % \ cur_props({'character_i':character_i+1, 'person_i':person_i+1, 'new_stroke':new_xs})) rtn.append("%(alphabets_list_name)s.character_yss{%(character_i)d}{%(person_i)d} = %(new_stroke)s;\n" % \ cur_props({'character_i':character_i+1, 'person_i':person_i+1, 'new_stroke':new_ys})) rtn.append("%(alphabets_list_name)s.character_tss{%(character_i)d}{%(person_i)d} = %(new_stroke)s;\n" % \ cur_props({'character_i':character_i+1, 'person_i':person_i+1, 'new_stroke':new_ts})) rtn.append( """%(alphabets_list_name)s.character_time_strokes{%(character_i)d}{%(person_i)d} = strcat('clf; ',... 'line(min(%(alphabets_list_name)s.character_xss{%(character_i)d}{%(person_i)d}), min(%(alphabets_list_name)s.character_yss{%(character_i)d}{%(person_i)d}));',... 'line(max(%(alphabets_list_name)s.character_xss{%(character_i)d}{%(person_i)d}), max(%(alphabets_list_name)s.character_yss{%(character_i)d}{%(person_i)d}));',... 'for point_i = 1:length(%(alphabets_list_name)s.character_xss{%(character_i)d}{%(person_i)d});',... 'line(%(alphabets_list_name)s.character_xss{%(character_i)d}{%(person_i)d}(1:point_i), %(alphabets_list_name)s.character_yss{%(character_i)d}{%(person_i)d}(1:point_i));',... 'getframe;',... %% this makes it take time. 'end;',... 'clear point_i;'); """ % cur_props({ 'character_i': character_i + 1, 'person_i': person_i + 1 })) elif save_stroke: rtn.append("""if save_stroke for character_i = 1:length(%(alphabets_list_name)s.character_xss) for person_i = 1:length(%(alphabets_list_name)s.character_xss{character_i}) new_xs = []; new_ys = []; new_ts = []; for line_i = 1:length(%(alphabets_list_name)s.character_xss{character_i}{person_i}) new_xs = [new_xs, %(alphabets_list_name)s.character_xss{character_i}{person_i}{line_i}, NaN]; new_ys = [new_ys, %(alphabets_list_name)s.character_yss{character_i}{person_i}{line_i}, NaN]; new_ts = [new_ts, %(alphabets_list_name)s.character_tss{character_i}{person_i}{line_i}, NaN]; end %(alphabets_list_name)s.character_xss{character_i}{person_i} = new_xs; %(alphabets_list_name)s.character_yss{character_i}{person_i} = new_ys; %(alphabets_list_name)s.character_tss{character_i}{person_i} = new_ts; %(alphabets_list_name)s.character_strokes{character_i}{person_i} = strcat('clf; plot(%(alphabets_list_name)s.character_xss{', num2str(character_i), '}{', num2str(person_i), '}, %(alphabets_list_name)s.character_yss{', num2str(character_i), '}{', num2str(person_i), '});'); %(alphabets_list_name)s.character_time_strokes{character_i}{person_i} = strcat('clf; ',... 'line(min(%(alphabets_list_name)s.character_xss{', num2str(character_i), '}{', num2str(person_i), '}), min(%(alphabets_list_name)s.character_yss{', num2str(character_i), '}{', num2str(person_i), '}));',... 'line(max(%(alphabets_list_name)s.character_xss{', num2str(character_i), '}{', num2str(person_i), '}), max(%(alphabets_list_name)s.character_yss{', num2str(character_i), '}{', num2str(person_i), '}));',... 'for point_i = 1:length(%(alphabets_list_name)s.character_xss{', num2str(character_i), '}{', num2str(person_i), '});',... 'line(%(alphabets_list_name)s.character_xss{', num2str(character_i), '}{', num2str(person_i), '}(1:point_i), %(alphabets_list_name)s.character_yss{', num2str(character_i), '}{', num2str(person_i), '}(1:point_i));',... 'getframe;',... %% this makes it take time. 'end;',... 'clear point_i;'); end end end """ % props) rtn.append(""" disp('%(alphabets_list_name)s'); disp(toc); """ % props) if alphabet_num % 10 == 0: rtn.append(""" %%disp('Packing...'); %%pack; %%disp('Done packing.'); """) rtn.append('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End ' + \ ('%s (%s) - %s' % (alphabet_id, alphabet_name, prefix)) + \ ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n\n\n') return ''.join(rtn)