Exemple #1
0
def test_randconfig_kmax(dimacs_):
    passed = 0
    common = list()
    init = True

    # check if randconfig exists
    cdir = os.path.dirname(dimacs_) + "/correctness/randconfigs/"
    if not os.path.exists(cdir):
        print("randconfig not found")
        return

    # get features and clauses
    _features, _clauses, _vars = read_dimacs(dimacs_)
    _names = [i[1] for i in _features]

    # iterate over each randconfig configurations
    for file in os.listdir(cdir):
        if file.endswith('.config'):
            with open(cdir + "/" + file, 'r') as f:
                _existing = set()

                sol = list()
                for line in f:
                    # line: # FEATURE is not set
                    if line.startswith('#'):
                        line = line[0:len(line) - 1]
                        data = line.split()
                        if len(data) > 4:
                            if data[1] in _names:
                                i = _names.index(data[1])
                                _existing.add(data[1])
                                if i != -1:
                                    sol.append('-' + _features[i][0])
                    # line: FEATURE=y or FEATURE="nonbool value"
                    else:
                        line = line[0:len(line) - 1]
                        data = line.split('=')
                        if len(data) > 1:
                            if data[0] in _names:
                                i = _names.index(data[0])
                                _existing.add(data[0])
                                if data[1] == 'y':
                                    sol.append(str(_features[i][0]))
                                    #print(_features[i][0])
                                elif data[1] == '\"\"' or data[1] == '0':
                                    if _features[i][3] != '\"\"' and _features[
                                            i][3] != '0':
                                        sol.append('-' + _features[i][0])
                                        #print('-' + _features[i][0])
                                    # else:
                                    #     #print(_features[i][1])
                                else:
                                    sol.append(str(_features[i][0]))
                                    #print(str(_features[i][0]))

                    outfile = cdir + '/check.dimacs'
                    gen_dimacs(_vars, _clauses, sol, outfile)
                    res = getoutput(SHARPSAT + ' -q ' + outfile)
                    print(line + ": " + str(res))
                    if not is_int(res):
                        print(file + " failed")
                        return

                # set all nonexistent variables to false
                # for f in _features:
                #     if f[1] not in _existing:
                #         sol.append('-' + str(f[0]))

                # sol.append('-55')
                # sol.append('-109')

                outfile = cdir + '/check.dimacs'

                gen_dimacs(_vars, _clauses, sol, outfile)
                res = getoutput(SHARPSAT + ' -q ' + outfile)

                if is_int(res):
                    if res != '1':
                        print(file + ": " + str(res))
                    else:
                        passed += 1
                else:
                    print(file + ": " + str(res))
                    if init:
                        common = sol
                        init = False
                    else:
                        for s in common:
                            if s not in sol:
                                common.remove(s)

    print("Passed:" + str(passed))
    print(common)
Exemple #2
0
def get_rank_unigen(dimacs_, sampleFile_):
    # read dimacs file for feature list
    _features, _clauses, _vars = read_dimacs(dimacs_)

    # read tree structure from file
    _treefile = os.path.dirname(dimacs_) + '/smarch/tree.json'
    # node = AnyNode(count=-1, cube=[])

    if os.path.exists(_treefile):
        with open(_treefile, 'r') as file:
            data = file.read()
            importer = JsonImporter()
            _root = importer.import_(data)
            total = _root.count
    else:
        print("ERROR: tree file not found!")
        return

    with open(sampleFile_, 'r') as f:
        i = 1
        for line in f:
            line = line[1:len(line)]
            raw = line.split()
            if len(raw) != 0:
                sol = raw[1:len(raw) - 1]
                #print(sol)
                # traverse tree based on solution
                _node = _root
                _precision = 0
                _number = 0

                _cdir = os.path.dirname(dimacs_) + '/'
                sdimacs = _cdir + "/sample.dimacs"
                ssol = _cdir + "/" + "sample.sol"
                gen_dimacs(_vars, _clauses, sol, sdimacs)
                getoutput("minisat " + sdimacs + " " + ssol)

                _outfile = os.path.dirname(sampleFile_) + '/validCheck.dimacs'
                gen_dimacs(_vars, _clauses, sol, _outfile)
                res = getoutput(SHARPSAT + ' -q ' + _outfile)

                fsol = list()
                with open(ssol, 'r') as f:
                    fsol = f.read().split()
                    del fsol[0]

                if is_int(res):
                    print(res, end=',')
                    while _precision == 0:
                        _node, _precision, _number = traverse_cube(
                            _node, fsol, _number)

                    if _precision > 0:
                        print(
                            str(_number / total) + "," +
                            str(_precision / total))
                    else:
                        print("ERROR: tree traverse failure")
                else:
                    print("ERROR: sample invalid")
            i += 1
Exemple #3
0
def test_randconfig_kcr(dimacs_, target_):
    # check if randconfig exists
    cdir = os.path.dirname(dimacs_) + "/randconfigs"
    if not os.path.exists(cdir):
        print("randconfig not found")
        return

    # get features and clauses
    _features, _clauses, _vars = read_dimacs(dimacs_)
    kf, kc, kv = read_dimacs("/home/jeho/kmax/kconfig_case_studies/cases/" +
                             target_ + "/kconfig.dimacs")
    _names = list()
    kn = [i[1] for i in kf]

    prefix = False

    for f in _features:
        if len(f) > 2:
            name = f[1]
            for i in range(2, len(f)):
                name = name + ' ' + f[i]
            if not name.startswith('CONFIG_') and prefix:
                name = 'CONFIG_' + name
            _names.append(name)
        else:
            name = f[1]
            if not name.startswith('CONFIG_') and prefix:
                name = 'CONFIG_' + name
            _names.append(name)

    # iterate over each randconfig configurations
    for file in os.listdir(cdir):
        if file.endswith('.config'):
            with open(cdir + "/" + file, 'r') as f:
                sol = set()
                ambig = set()
                for line in f:
                    if line.startswith('#'):
                        line = line[0:len(line) - 1]
                        data = line.split()
                        if len(data) > 4:
                            if data[1] in _names:
                                i = _names.index(data[1])
                                if i != -1:
                                    sol.add('-' + _features[i][0])
                            # else:
                            #     print(line)
                    else:
                        line = line[0:len(line) - 1]
                        data = line.split('=')
                        if len(data) > 1:
                            if data[1] == 'y':
                                if data[0] in _names:
                                    i = _names.index(data[0])
                                    sol.add(str(_features[i][0]))
                                # else:
                                #     print('y: '+data[0])
                            elif data[1] == '\"\"' or data[1] == '0':
                                if data[0] in kn:
                                    k = kn.index(data[0])
                                    if kf[k][3] != '\"\"' and kf[k][3] != '0':
                                        feature = data[0] + '=n'
                                        if feature in _names:
                                            i = _names.index(feature)
                                            sol.add(str(_features[i][0]))
                                        # else:
                                        #     print("Not in dimacs: " + feature)
                                    else:
                                        # print('n: ' + line)
                                        ambig.add(data[0])
                                        # feature = data[0] + '=n'
                                        # if feature in _names:
                                        #     i = _names.index(feature)
                                        #     sol.add(str(_features[i][0]))
                            else:
                                temp = line.replace('\"', '')
                                feature = temp.replace('\\\\', '\\')
                                if feature in _names:
                                    i = _names.index(feature)
                                    sol.add(str(_features[i][0]))
                                else:
                                    if data[0] in kn:
                                        k = kn.index(data[0])
                                        dv = kf[k][3].replace('\"', '')
                                        dv = dv.replace('\\\\', '\\')
                                        feature = data[0] + '=' + dv
                                        if feature in _names:
                                            i = _names.index(feature)
                                            sol.add(str(_features[i][0]))
                                        # else:
                                        #     print("Not in dimacs: " + feature)
                                    else:
                                        for ft in kn:
                                            print(ft)
                                        print('nb: ' + line + "," + feature)

                    # outfile = cdir + '/check.dimacs'
                    # gen_dimacs(_vars, _clauses, sol, outfile)
                    # res = getoutput(SHARPSAT + ' -q ' + outfile)
                    # print(line + ": " + str(res))
                    # print(sol)
                    # if not is_int(res):
                    #     print(file + " failed")
                    #     return

                outfile = cdir + '/check.dimacs'
                gen_dimacs(_vars, _clauses, sol, outfile)
                res = getoutput(SHARPSAT + ' -q ' + outfile)

                if is_int(res):
                    print(file + "," + str(len(_features) - len(sol)) + "," +
                          str(len(ambig)) + "," + str(res) + "," + str(ambig))
                else:
                    print(file + "," + str(len(_features) - len(sol)) + "," +
                          str(len(ambig)) + ",0")
Exemple #4
0
def test_randconfig_kcr(dimacs_, target_, cdir_):
    # get features and clauses
    _features, _clauses, _vars = read_dimacs(dimacs_)
    kf, kc, kv = read_dimacs("/home/jeho/kmax/kconfig_case_studies/cases/" +
                             target_ + "/kconfig.dimacs")
    _names = list()
    kn = [i[1] for i in kf]

    passed = 0
    common = list()
    init = True

    prefix = False

    for f in _features:
        if len(f) > 2:
            name = f[1]
            for i in range(2, len(f)):
                name = name + ' ' + f[i]
            if not name.startswith('CONFIG_') and prefix:
                name = 'CONFIG_' + name
            _names.append(name)
        else:
            name = f[1]
            if not name.startswith('CONFIG_') and prefix:
                name = 'CONFIG_' + name
            _names.append(name)

    # iterate over each randconfig configurations
    for file in os.listdir(cdir_):
        if file.endswith('.config'):
            with open(cdir_ + "/" + file, 'r') as f:
                sol = set()
                ambig = set()
                for line in f:
                    if line.startswith('#'):
                        line = line[0:len(line) - 1]
                        data = line.split()
                        if len(data) > 4:
                            if data[1] in _names:
                                i = _names.index(data[1])
                                if i != -1:
                                    sol.add(-1 * _features[i][0])
                            # else:
                            #     print(line)
                    else:
                        line = line[0:len(line) - 1]
                        data = line.split('=')
                        if len(data) > 1:
                            if data[1] == 'y':
                                if data[0] in _names:
                                    i = _names.index(data[0])
                                    sol.add(_features[i][0])
                                # else:
                                #     print('y: '+data[0])
                            elif data[1] == '\"\"' or data[1] == '0':
                                if data[0] in kn:
                                    k = kn.index(data[0])
                                    if kf[k][3] != '\"\"' and kf[k][3] != '0':
                                        feature = data[0] + '=n'
                                        if feature in _names:
                                            i = _names.index(feature)
                                            sol.add(_features[i][0])
                                        # else:
                                        #     print("Not in dimacs: " + feature)
                                    else:
                                        # print('n: ' + line)
                                        ambig.add(k)
                                        # feature = data[0] + '=n'
                                        # if feature in _names:
                                        #     i = _names.index(feature)
                                        #     sol.add(str(_features[i][0]))
                            else:
                                temp = line.replace('\"', '')
                                feature = temp.replace('\\\\', '\\')
                                if feature in _names:
                                    i = _names.index(feature)
                                    sol.add(_features[i][0])
                                else:
                                    if data[0] in kn:
                                        k = kn.index(data[0])
                                        dv = kf[k][3].replace('\"', '')
                                        dv = dv.replace('\\\\', '\\')
                                        feature = data[0] + '=' + dv
                                        if feature in _names:
                                            i = _names.index(feature)
                                            sol.add(_features[i][0])
                                        # else:
                                        #     print("Not in dimacs: " + feature)
                                    else:
                                        for ft in kn:
                                            print(ft)
                                        print('nb: ' + line + "," + feature)

                    # outfile = cdir + '/check.dimacs'
                    # gen_dimacs(_vars, _clauses, sol, outfile)
                    # res = getoutput(SHARPSAT + ' -q ' + outfile)
                    # print(line + ": " + str(res))
                    # print(sol)
                    # if not is_int(res):
                    #     print(file + " failed")
                    #     return

                outfile = cdir_ + '/check.dimacs'
                gen_dimacs(_vars, _clauses, sol, outfile)
                res = getoutput(SHARPSAT + ' -q ' + outfile)

                freecount = 0
                for a in ambig:
                    free = True

                    test = sol.copy()
                    test.add(a)
                    gen_dimacs(_vars, _clauses, test, outfile)
                    ares = getoutput(SHARPSAT + ' -q ' + outfile)
                    if not is_int(ares):
                        free = False

                    test = sol.copy()
                    test.add(-1 * a)
                    gen_dimacs(_vars, _clauses, test, outfile)
                    ares = getoutput(SHARPSAT + ' -q ' + outfile)
                    if not is_int(ares):
                        free = False

                    if free:
                        freecount += 1
                # else:
                #     print(file + ": " + str(res))
                #     if init:
                #         common = sol
                #         init = False
                #     else:
                #         for s in common:
                #             if s not in sol:
                #                 common.remove(s)

                if is_int(res):
                    val = int(res) / (2**freecount)
                    print(file + ": " + str(val))
                    if val == 1.0:
                        passed += 1
                else:
                    print(file + ": " + "INV")

                # if is_int(res):
                #     print(file + ":" + str(len(_features) - len(sol)) + "," + str(len(ambig)) + "," + str(res) + "," + str(ambig))
                # else:
                #     print(file + ":" + str(len(_features) - len(sol)) + "," + str(len(ambig)) + ",0")

    print("Passed:" + str(passed))
    print(common)