示例#1
0
def cli_readIterator(lines, start_index, parent, gui):
    i = start_index
    it = MikenetIterator(gui, parent)
    while '</iterator>' not in lines[i]:
        if '<parameter>' in lines[i]:
            i = readParameter(lines, i + 1, it, gui)

        elif '<varying_parameter>' in lines[i]:
            i = readVaryingParameter(lines, i + 1, it, gui)

        elif '<iterator>' in lines[i]:
            i = cli_readIterator(lines, i + 1, it, gui)

        elif '<run>' in lines[i]:
            i = cli_readRun(lines, i + 1, it, gui)

        elif 'random_flag' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            it.setRandomFlag(guts.smartEval(r))

        elif 'applied_paths' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            it.setAppliedPaths(guts.smartEval(r))

        i += 1
    # add newly created iterator to parent
    parent.getChildren().append(it)
    it.syncToRun()
    return i
示例#2
0
def cli_readPhaseItem(lines, start_index, parent, gui):
    i = start_index
    phase_item = MikenetPhaseItem(gui, parent)
    #TODO read test sets
    while '</phase_item>' not in lines[i]:
        if '=' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            if l == 'my_profile':
                phase_item.setProfile(r)
            elif l == 'mode':
                phase_item.setModeWithText(r)
            elif l == 'recording_data':
                phase_item.setRawRecordingData(guts.smartEval(r))
            elif l == 'net_components':
                phase_item.setRawNetComponents(guts.smartEval(r))
            elif l == 'noise_data':
                phase_item.setRawNoiseData(guts.smartEval(r))
            elif l == 'test_profiles':
                phase_item.test_profiles = guts.smartEval(r)

        elif '<parameter>' in lines[i]:
            i = readParameter(lines, i + 1, phase_item, gui)

        elif '<overrides>' in lines[i]:
            i = readOverrides(lines, i + 1, phase_item, gui)

        i += 1
    # add newly created phase item to phase
    parent.children.append(phase_item)
    return i
示例#3
0
def cli_readPhaseItem(lines,start_index,parent,gui):
    i = start_index
    phase_item = MikenetPhaseItem(gui,parent)
    #TODO read test sets
    while '</phase_item>' not in lines[i]:
        if '=' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            if l == 'my_profile':
                phase_item.setProfile(r)
            elif l == 'mode':
                phase_item.setModeWithText(r)
            elif l == 'recording_data':
                phase_item.setRawRecordingData(guts.smartEval(r))
            elif l == 'net_components':
                phase_item.setRawNetComponents(guts.smartEval(r))
            elif l == 'noise_data':
                phase_item.setRawNoiseData(guts.smartEval(r))
            elif l == 'test_profiles':
                phase_item.test_profiles = guts.smartEval(r)
                
        elif '<parameter>' in lines[i]:
            i = readParameter(lines,i+1,phase_item,gui)
        
        elif '<overrides>' in lines[i]:
            i = readOverrides(lines,i+1,phase_item,gui)
            
        i += 1
    # add newly created phase item to phase
    parent.children.append(phase_item)
    return i
示例#4
0
def cli_readIterator(lines,start_index,parent,gui):
    i = start_index
    it = MikenetIterator(gui,parent)
    while '</iterator>' not in lines[i]:
        if '<parameter>' in lines[i]:
            i = readParameter(lines,i+1,it,gui)
            
        elif '<varying_parameter>' in lines[i]:
            i = readVaryingParameter(lines,i+1,it,gui)
            
        elif '<iterator>' in lines[i]:
            i = cli_readIterator(lines,i+1,it,gui)
            
        elif '<run>' in lines[i]:
            i = cli_readRun(lines,i+1,it,gui)

        elif 'random_flag' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            it.setRandomFlag(guts.smartEval(r))
            
        elif 'applied_paths' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            it.setAppliedPaths(guts.smartEval(r))

        i += 1
    # add newly created iterator to parent
    parent.getChildren().append(it)
    it.syncToRun()
    return i
示例#5
0
def cli_readRun(lines, start_index, parent, gui):
    i = start_index
    run = MikenetRun(gui, parent)
    while '</run>' not in lines[i]:
        if '=' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            if l == 'groups':
                run.setGroups(guts.smartEval(r))
            elif l == 'matrix':
                run.setMatrix(guts.smartEval(r))
        elif '<phase>' in lines[i]:
            i = cli_readPhase(lines, i + 1, run, gui)
        elif '<parameter>' in lines[i]:
            i = readParameter(lines, i + 1, run, gui)
        i += 1
    # add newly created run to parent
    parent.children.append(run)
    return i
示例#6
0
def cli_readRun(lines,start_index,parent,gui):
    i = start_index
    run = MikenetRun(gui,parent)
    while '</run>' not in lines[i]:
        if '=' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            if l == 'groups':
                run.setGroups(guts.smartEval(r))
            elif l == 'matrix':
                run.setMatrix(guts.smartEval(r))
        elif '<phase>' in lines[i]:
            i = cli_readPhase(lines,i+1,run,gui)
        elif '<parameter>' in lines[i]:
            i = readParameter(lines,i+1,run,gui)
        i += 1
    # add newly created run to parent
    parent.children.append(run)
    return i
示例#7
0
def initializeTables(path, db, driver):
    # map python datatypes to sql datatypes
    type_map = {}
    if driver == 'QSQLITE':
        type_map = {int: 'INTEGER', float: 'REAL', str: 'TEXT'}
    elif driver == 'QMYSQL':
        type_map = {int: 'INT', float: 'FLOAT', str: 'TEXT'}
    # metadata
    # get the field names from the metadata file in this directory
    fields = ['id ' + type_map[int], 'run_id ' + type_map[int]]
    f_list = glob.glob(os.path.join(path, '*.metadata'))
    for f in f_list:
        # open the metadata file
        with open(f, 'rU') as src:
            for line in src:
                # skip empty lines
                if line == '\n':
                    pass
                elif 'GROUP\t' not in line:
                    data = line.split('\t')
                    data = [x for x in data if len(x) > 1]
                    for d in data:
                        l, r = guts.evaluateEq(d)
                        r = guts.smartEval(r)
                        fields.append(str(str(l) + ' ' + type_map[type(r)]))
    fields = list(set(fields))
    field_str = ','.join(fields)
    q = QtSql.QSqlQuery(db)
    q.exec_(str('create table if not exists metadata(' + field_str + ');'))

    # groupdata
    # group fields and datatypes are going to be more restricted
    q = QtSql.QSqlQuery(db)
    q.exec_(
        str('create table if not exists groupdata(' + 'id ' + type_map[int] +
            ',run_id ' + type_map[int] + ',group ' + type_map[str] +
            ',units ' + type_map[int] + ',activation_type ' + type_map[str] +
            ',error_computation_type ' + type_map[str] + ');'))

    # errordata
    q = QtSql.QSqlQuery(db)
    q.exec_(
        str('create table if not exists errordata(' + 'id ' + type_map[int] +
            ',run_id ' + type_map[int] + ',run_trial ' + type_map[int] +
            ',trial ' + type_map[int] + ',error ' + type_map[float] + ');'))

    # activationdata

    # noisedata
    q = QtSql.QSqlQuery(db)
    q.exec_(
        str('create table if not exists noisedata(' + 'id ' + type_map[int] +
            ',run_id ' + type_map[int] + ',noise_type ' + type_map[str] +
            ',noise_object ' + type_map[str] + ',noise_amount ' +
            type_map[float] + ');'))
示例#8
0
def readTrainingProfile(lines,start_index,parent,gui):
    i = start_index
    prof = MikenetTrainingProfile(gui,parent)
    while '</training_profile>' not in lines[i]:
        if 'category_labels' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            prof.setCategories(guts.smartEval(r))
        elif '<parameter>' in lines[i]:
            i = readParameter(lines,i+1,prof,gui)
        i += 1
    # add the newly created profile to the script
    parent.getChildren().append(prof)
    return i
示例#9
0
def readTrainingProfile(lines, start_index, parent, gui):
    i = start_index
    prof = MikenetTrainingProfile(gui, parent)
    while '</training_profile>' not in lines[i]:
        if 'category_labels' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            prof.setCategories(guts.smartEval(r))
        elif '<parameter>' in lines[i]:
            i = readParameter(lines, i + 1, prof, gui)
        i += 1
    # add the newly created profile to the script
    parent.getChildren().append(prof)
    return i
示例#10
0
def readRun(lines, start_index, parent, gui):
    i = start_index
    run = MikenetRun(gui, parent)
    while '</run>' not in lines[i]:
        if '=' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            if l == 'groups':
                run.setGroups(guts.smartEval(r))
            elif l == 'matrix':
                run.setMatrix(guts.smartEval(r))
        elif '<phase>' in lines[i]:
            i = readPhase(lines, i + 1, run, gui)
        elif '<parameter>' in lines[i]:
            i = readParameter(lines, i + 1, run, gui)
        i += 1
    # add newly created run to parent
    parent.children.append(run)
    run.createTab()
    # phases have special widgets instead of tabs
    # need to create these AFTER the run tab is made
    for phase in run.getChildren():
        phase.createWidget()
    return i
示例#11
0
def readRun(lines,start_index,parent,gui):
    i = start_index
    run = MikenetRun(gui,parent)
    while '</run>' not in lines[i]:
        if '=' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            if l == 'groups':
                run.setGroups(guts.smartEval(r))
            elif l == 'matrix':
                run.setMatrix(guts.smartEval(r))
        elif '<phase>' in lines[i]:
            i = readPhase(lines,i+1,run,gui)
        elif '<parameter>' in lines[i]:
            i = readParameter(lines,i+1,run,gui)
        i += 1
    # add newly created run to parent
    parent.children.append(run)
    run.createTab()
    # phases have special widgets instead of tabs
    # need to create these AFTER the run tab is made
    for phase in run.getChildren():
        phase.createWidget()
    return i
示例#12
0
def readParameterOverride(lines, start_index, o_list, gui):
    i = start_index
    paramDict = {}
    while '</parameter>' not in lines[i]:
        if '=' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            if r == ';':
                # must have been an empty text field
                paramDict[l] = ''
            else:
                r = r[:-1]
                paramDict[l] = guts.smartEval(r)
        i += 1

    o_list.append(MikenetParameter(gui, **paramDict))
    return i
示例#13
0
def readParameterOverride(lines,start_index,o_list,gui):
    i = start_index
    paramDict = {}
    while '</parameter>' not in lines[i]:
        if '=' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            if r == ';':
                # must have been an empty text field
                paramDict[l] = ''
            else:
                r = r[:-1]
                paramDict[l] = guts.smartEval(r)
        i += 1
        
    o_list.append(MikenetParameter(gui,**paramDict))
    return i
示例#14
0
def readVaryingParameter(lines,start_index,iterator,gui):
    '''special method for iterator's "varying" parameter'''
    i = start_index
    paramDict = {}
    while '</varying_parameter>' not in lines[i]:
        if '=' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            if r == ';':
                # must have been an empty text field
                paramDict[l] = ''
            else:
                r = r[:-1]
                paramDict[l] = guts.smartEval(r)
        i += 1
  
    iterator.setVarying(MikenetParameter(gui,**paramDict))
    return i
示例#15
0
def readVaryingParameter(lines, start_index, iterator, gui):
    '''special method for iterator's "varying" parameter'''
    i = start_index
    paramDict = {}
    while '</varying_parameter>' not in lines[i]:
        if '=' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            if r == ';':
                # must have been an empty text field
                paramDict[l] = ''
            else:
                r = r[:-1]
                paramDict[l] = guts.smartEval(r)
        i += 1

    iterator.setVarying(MikenetParameter(gui, **paramDict))
    return i
示例#16
0
def readParameter(lines,start_index,parent,gui):
    i = start_index
    paramDict = {}
    while '</parameter>' not in lines[i]:
        if '=' in lines[i]:
            l,r = guts.evaluateEq(lines[i])
            if r == ';':
                # must have been an empty text field
                paramDict[l] = ''
            else:
                r = r[:-1]
                paramDict[l] = guts.smartEval(r)
        i += 1
    if type(parent.parameters) == dict:
        name = paramDict['variable_name']
        parent.parameters[name] = MikenetParameter(gui,**paramDict)
    else:
        parent.parameters.append(MikenetParameter(gui,**paramDict))
    return i
示例#17
0
def readParameter(lines, start_index, parent, gui):
    i = start_index
    paramDict = {}
    while '</parameter>' not in lines[i]:
        if '=' in lines[i]:
            l, r = guts.evaluateEq(lines[i])
            if r == ';':
                # must have been an empty text field
                paramDict[l] = ''
            else:
                r = r[:-1]
                paramDict[l] = guts.smartEval(r)
        i += 1
    if type(parent.parameters) == dict:
        name = paramDict['variable_name']
        parent.parameters[name] = MikenetParameter(gui, **paramDict)
    else:
        parent.parameters.append(MikenetParameter(gui, **paramDict))
    return i
示例#18
0
def readScript(gui, fname):
    script = MikenetScript(gui)
    try:
        with open(fname, 'r') as f:
            lines = f.readlines()
            # preprocess by removing empty lines and stripping whitespace
            lines = [x.strip() for x in lines if x != '\n']
            i = 0
            while '</script>' not in lines[i]:
                if '&default&' in lines[i]:
                    l, r = guts.evaluateEq(lines[i])
                    script.defaults.append(guts.smartEval(r))

                elif '<run>' in lines[i]:
                    i = readRun(lines, i + 1, script, gui)

                elif '<iterator>' in lines[i]:
                    i = readIterator(lines, i + 1, script, gui)

                elif '<parameter>' in lines[i]:
                    i = readParameter(lines, i + 1, script, gui)

                elif '<training_profile>' in lines[i]:
                    i = readTrainingProfile(lines, i + 1,
                                            script.training_profiles, gui)

                elif '<test_profile>' in lines[i]:
                    i = readTestProfile(lines, i + 1, script.test_profiles,
                                        gui)

                i += 1

        script.createTab()
        return script
    except:
        dialogs.showError(
            gui, 'There was a problem reading file ' + fname +
            '. Please check the file formatting and try again.', '')
        traceback.print_exc(file=sys.stdout)
        return None
示例#19
0
def readScript(gui,fname):
    script = MikenetScript(gui)
    try:
        with open(fname,'r') as f:
            lines = f.readlines()
            # preprocess by removing empty lines and stripping whitespace
            lines = [x.strip() for x in lines if x != '\n']
            i = 0
            while '</script>' not in lines[i]:
                if '&default&' in lines[i]:
                    l,r = guts.evaluateEq(lines[i])
                    script.defaults.append(guts.smartEval(r))

                elif '<run>' in lines[i]:
                    i = readRun(lines,i+1,script,gui)
                    
                elif '<iterator>' in lines[i]:
                    i = readIterator(lines,i+1,script,gui)
                        
                elif '<parameter>' in lines[i]:
                    i = readParameter(lines,i+1,script,gui)
                    
                elif '<training_profile>' in lines[i]:
                    i = readTrainingProfile(lines,i+1,script.training_profiles,gui)
                    
                elif '<test_profile>' in lines[i]:
                    i = readTestProfile(lines,i+1,script.test_profiles,gui)

                i += 1

        script.createTab()
        return script
    except:
        dialogs.showError(gui,'There was a problem reading file '+fname+
                          '. Please check the file formatting and try again.','')
        traceback.print_exc(file=sys.stdout)
        return None
示例#20
0
def initializeTables(path,db,driver):
    # map python datatypes to sql datatypes
    type_map = {}
    if driver == 'QSQLITE':
        type_map = {int: 'INTEGER',
                    float: 'REAL',
                    str: 'TEXT'}
    elif driver == 'QMYSQL':
        type_map = {int: 'INT',
                    float: 'FLOAT',
                    str: 'TEXT'}
    # metadata
    # get the field names from the metadata file in this directory
    fields = ['id '+type_map[int],'run_id '+type_map[int]]
    f_list = glob.glob(os.path.join(path,'*.metadata'))
    for f in f_list:
        # open the metadata file
        with open(f,'rU') as src:
            for line in src:
                # skip empty lines
                if line == '\n':
                    pass
                elif 'GROUP\t' not in line:
                    data = line.split('\t')
                    data = [x for x in data if len(x) > 1]
                    for d in data:
                        l,r = guts.evaluateEq(d)
                        r = guts.smartEval(r)
                        fields.append(str(str(l) + ' ' +
                                          type_map[type(r)]))
    fields = list(set(fields))
    field_str = ','.join(fields)
    q = QtSql.QSqlQuery(db)
    q.exec_(str('create table if not exists metadata(' +
                field_str + ');'))
    
    # groupdata
    # group fields and datatypes are going to be more restricted
    q = QtSql.QSqlQuery(db)
    q.exec_(str('create table if not exists groupdata(' +
                'id ' + type_map[int] +
                ',run_id ' + type_map[int] +
                ',group ' + type_map[str] +
                ',units ' + type_map[int] +
                ',activation_type ' + type_map[str] +
                ',error_computation_type ' + type_map[str] +
                ');'))

    # errordata
    q = QtSql.QSqlQuery(db)
    q.exec_(str('create table if not exists errordata(' +
                'id ' + type_map[int] +
                ',run_id ' + type_map[int] +
                ',run_trial ' + type_map[int] +
                ',trial ' + type_map[int] +
                ',error ' + type_map[float] +
                ');'))
    
    # activationdata
    
    # noisedata
    q = QtSql.QSqlQuery(db)
    q.exec_(str('create table if not exists noisedata(' +
                'id ' + type_map[int] +
                ',run_id ' + type_map[int] +
                ',noise_type ' + type_map[str] +
                ',noise_object ' + type_map[str] +
                ',noise_amount ' + type_map[float] +
                ');'))
示例#21
0
def pushRunData(path, gui):
    driver = decodeDriver(gui)
    # connect to database
    # to run as a standalone test, call with gui == None
    if not gui:
        db = testDB(driver)
    else:
        # need unique connection name. use name of folder, which is the run name
        garbage, run_name = os.path.split(path)
        db = connectToDB(gui, driver, run_name)  # for real life

    if not db:
        # return path if there was a problem so it can be reported
        return path

    ###############################################################
    # create tables (if a new database)
    initializeTables(path, db, driver)
    test_fields = initializeTestTables(path, db, driver)

    # get a unique index for this whole run
    run_index = getRunIndex(db)

    # create a dict to map phase item names to unique indices
    phase_item_map = {}

    # push metadata AND group data if metadata file exists
    f_list = glob.glob(os.path.join(path, '*.metadata'))
    for f in f_list:
        # open the metadata file
        with open(f, 'rU') as src:
            for line in src:
                # skip empty lines
                if line == '\n':
                    pass
                elif 'GROUP\t' in line:
                    # pushing group record
                    data = line.split('\t')
                    data = [x for x in data if len(x) > 1]
                    # get rid of 'GROUP' tag
                    data = data[1:]
                    column_names = []
                    values = []
                    for d in data:
                        l, r = guts.evaluateEq(d)
                        r = guts.smartEval(r)
                        if str(l) == 'phase_item':
                            if str(r) not in phase_item_map:
                                assignUnusedIndex(db, str(r), phase_item_map)
                            column_names.insert(0, 'run_id')
                            values.insert(0, run_index)
                            column_names.insert(0, 'id')
                            values.insert(0, phase_item_map[str(r)])
                            # don't actually write the phase item name.
                            # it's only needed to obtain the unique id
                        else:
                            # not phase item name, so write this entry
                            column_names.append(str(l))
                            values.append(str(r))

                    pushRecord(db, 'groupdata', column_names, values)

                else:
                    # pushing metadata record
                    # push each column individually to be robust against
                    # changes in column order
                    data = line.split('\t')
                    data = [x for x in data if len(x) > 1]
                    column_names = []
                    values = []
                    for d in data:
                        l, r = guts.evaluateEq(d)
                        column_names.append(str(l))
                        values.append(str(r))
                        if str(l) == 'phase_item':
                            # in metadata, each row needs to be unique
                            # and needs to include phase item and run names
                            assignUnusedIndex(db, str(r), phase_item_map)
                            column_names.insert(0, 'run_id')
                            values.insert(0, run_index)
                            column_names.insert(0, 'id')
                            values.insert(0, phase_item_map[str(r)])

                    pushRecord(db, 'metadata', column_names, values)

    # same for error and noise (both are taken from the log file)
    f_list = glob.glob(os.path.join(path, '*.log'))
    for f in f_list:
        with open(f, 'rU') as src:
            srclines = src.readlines()
            srclines = [x.replace('\n', '') for x in srclines]
            # error first
            lines = [x for x in srclines if 'avgError:' in x]
            for l in lines:
                lsplit = l.split('\t')
                # make sure the id is unique, get a new one if necessary
                if lsplit[1] not in phase_item_map:
                    assignUnusedIndex(db, str(lsplit[1]), phase_item_map)
                lsplit[0] = phase_item_map[str(lsplit[1])]
                lsplit.insert(0, run_index)
                # don't need phase item name in the actual record
                lsplit.pop(2)
                pushRecord(db, 'errordata',
                           ['run_id', 'id', 'run_trial', 'trial', 'error'],
                           lsplit)
            # then noise
            lines = [x for x in srclines if 'noiseData:' in x]
            for l in lines:
                lsplit = l.split('\t')
                # make sure the id is unique, get a new one if necessary
                if lsplit[1] not in phase_item_map:
                    assignUnusedIndex(db, str(lsplit[1]), phase_item_map)
                lsplit[0] = phase_item_map[str(lsplit[1])]
                lsplit.insert(0, run_index)
                # don't need phase item name in the actual record
                lsplit.pop(2)
                pushRecord(db, 'noisedata', [
                    'run_id', 'id', 'noise_type', 'noise_object',
                    'noise_amount'
                ], lsplit)

    # same for activations

    # same for test output
    f_list = glob.glob(os.path.join(path, '*.test'))
    for f in f_list:
        trash, name_plus = os.path.split(f)
        f_split = name_plus.split('_')
        test_name = str(f_split[0])
        run_trial = str(f_split[1])
        with open(f, 'rU') as src:
            for line in src:
                # add run_id and run_trial to the data entry
                data = line.split('\t')
                data.insert(0, str(run_trial))
                data.insert(0, str(run_index))
                if data[-1] == '\n':
                    data = data[:-1]
                pushRecord(db, test_name, test_fields[:len(data)], data)

    db.close()
    return None
示例#22
0
def pushRunData(path,gui):
    driver = decodeDriver(gui)    
    # connect to database
    # to run as a standalone test, call with gui == None
    if not gui:
        db = testDB(driver)
    else:
        # need unique connection name. use name of folder, which is the run name
        garbage,run_name = os.path.split(path)
        db = connectToDB(gui,driver,run_name) # for real life
    
    if not db:
        # return path if there was a problem so it can be reported
        return path
    
    ###############################################################
    # create tables (if a new database)
    initializeTables(path,db,driver)
    test_fields = initializeTestTables(path,db,driver)

    # get a unique index for this whole run
    run_index = getRunIndex(db)
    
    # create a dict to map phase item names to unique indices
    phase_item_map = {}
    
    # push metadata AND group data if metadata file exists
    f_list = glob.glob(os.path.join(path,'*.metadata'))
    for f in f_list:
        # open the metadata file
        with open(f,'rU') as src:
            for line in src:
                # skip empty lines
                if line == '\n':
                    pass
                elif 'GROUP\t' in line:
                    # pushing group record
                    data = line.split('\t')
                    data = [x for x in data if len(x) > 1]
                    # get rid of 'GROUP' tag
                    data = data[1:]
                    column_names = []
                    values = []
                    for d in data:
                        l,r = guts.evaluateEq(d)
                        r = guts.smartEval(r)
                        if str(l) == 'phase_item':
                            if str(r) not in phase_item_map:
                                assignUnusedIndex(db,str(r),phase_item_map)
                            column_names.insert(0,'run_id')
                            values.insert(0,run_index)
                            column_names.insert(0,'id')
                            values.insert(0,phase_item_map[str(r)])
                            # don't actually write the phase item name.
                            # it's only needed to obtain the unique id
                        else:
                            # not phase item name, so write this entry
                            column_names.append(str(l))
                            values.append(str(r))
                            
                    pushRecord(db,'groupdata',column_names,values)
                    
                else:
                    # pushing metadata record
                    # push each column individually to be robust against
                    # changes in column order
                    data = line.split('\t')
                    data = [x for x in data if len(x) > 1]
                    column_names = []
                    values = []
                    for d in data:
                        l,r = guts.evaluateEq(d)
                        column_names.append(str(l))
                        values.append(str(r))
                        if str(l) == 'phase_item':
                            # in metadata, each row needs to be unique
                            # and needs to include phase item and run names
                            assignUnusedIndex(db,str(r),phase_item_map)
                            column_names.insert(0,'run_id')
                            values.insert(0,run_index)
                            column_names.insert(0,'id')
                            values.insert(0,phase_item_map[str(r)])
                            
                    pushRecord(db,'metadata',column_names,values)


    # same for error and noise (both are taken from the log file)
    f_list = glob.glob(os.path.join(path,'*.log'))
    for f in f_list:
        with open(f,'rU') as src:
            srclines = src.readlines()
            srclines = [x.replace('\n','') for x in srclines]
            # error first
            lines = [x for x in srclines if 'avgError:' in x]
            for l in lines:
                lsplit = l.split('\t')
                # make sure the id is unique, get a new one if necessary
                if lsplit[1] not in phase_item_map:
                    assignUnusedIndex(db,str(lsplit[1]),phase_item_map)
                lsplit[0] = phase_item_map[str(lsplit[1])]
                lsplit.insert(0,run_index)
                # don't need phase item name in the actual record
                lsplit.pop(2)
                pushRecord(db,'errordata',
                           ['run_id','id','run_trial','trial','error'],
                           lsplit)
            # then noise
            lines = [x for x in srclines if 'noiseData:' in x]
            for l in lines:
                lsplit = l.split('\t')
                # make sure the id is unique, get a new one if necessary
                if lsplit[1] not in phase_item_map:
                    assignUnusedIndex(db,str(lsplit[1]),phase_item_map)
                lsplit[0] = phase_item_map[str(lsplit[1])]
                lsplit.insert(0,run_index)
                # don't need phase item name in the actual record
                lsplit.pop(2)
                pushRecord(db,'noisedata',
                           ['run_id','id','noise_type','noise_object','noise_amount'],
                           lsplit)

    # same for activations
    

    # same for test output
    f_list = glob.glob(os.path.join(path,'*.test'))
    for f in f_list:
        trash,name_plus = os.path.split(f)
        f_split = name_plus.split('_')
        test_name = str(f_split[0])
        run_trial = str(f_split[1])
        with open(f,'rU') as src:
            for line in src:
                # add run_id and run_trial to the data entry
                data = line.split('\t')
                data.insert(0,str(run_trial))
                data.insert(0,str(run_index))
                if data[-1] == '\n':
                    data = data[:-1]
                pushRecord(db,test_name,test_fields[:len(data)],data)
                
            
    db.close()
    return None