Example #1
0
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()
Example #2
0
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)