def question_3():
    print_title(2)
    tested[2] = True

    fails = [False, False, False, False, False, False, False, False]
    v1 = Variable('V1', [1, 2])
    v2 = Variable('V2', [1, 2])
    v3 = Variable('V3', [1, 2, 3, 4, 5])
    v4 = Variable('V4', [1, 2, 3, 4, 5])
    v5 = Variable('V5', [1, 2, 3, 4, 5])
    v6 = Variable('V6', [1, 2, 3, 4, 5, 6, 7, 8, 9])
    v7 = Variable('V7', [1, 2, 3, 4, 5, 6, 7, 8, 9])
    v8 = Variable('V8', [1, 2, 3, 4, 5, 6, 7, 8, 9])
    v9 = Variable('V9', [1, 2, 3, 4, 5, 6, 7, 8, 9])
    vars = [v1, v2, v3, v4, v5, v6, v7, v8, v9]
    ac = AllDiffConstraint('test9', vars)
    testcsp = CSP('test', vars, [ac])
    GacEnforce([ac], testcsp, None, None)

    #v1.pruneValue(1, None, None)

    test1 = "    v1 = Variable('V1', [1, 2])\n\
    v2 = Variable('V2', [1, 2])\n\
    v3 = Variable('V3', [1, 2, 3, 4, 5])\n\
    v4 = Variable('V4', [1, 2, 3, 4, 5])\n\
    v5 = Variable('V5', [1, 2, 3, 4, 5])\n\
    v6 = Variable('V6', [1, 2, 3, 4, 5, 6, 7, 8, 9])\n\
    v7 = Variable('V7', [1, 2, 3, 4, 5, 6, 7, 8, 9])\n\
    v8 = Variable('V8', [1, 2, 3, 4, 5, 6, 7, 8, 9])\n\
    v9 = Variable('V9', [1, 2, 3, 4, 5, 6, 7, 8, 9])\n\
    vars = [v1, v2, v3, v4, v5, v6, v7, v8, v9]\n\
    ac = AllDiffConstraint('test9', vars)\n\
    testcsp = CSP('test', vars, [ac])\n\
    GacEnforce([ac], testcsp, None, None)"

    soln_doms = [
        set([1, 2]),
        set([1, 2]),
        set([3, 4, 5]),
        set([3, 4, 5]),
        set([3, 4, 5]),
        set([6, 7, 8, 9]),
        set([6, 7, 8, 9]),
        set([6, 7, 8, 9]),
        set([6, 7, 8, 9])
    ]

    for i, v in enumerate(vars):
        if set(v.curDomain()) != soln_doms[i]:
            fails[0] = True
            print "Error: {}.curDomain() == {}".format(v.name(), v.curDomain())
            print "Correct curDomin should be == {}".format(list(soln_doms[i]))

    if fails[0]:
        print "\nFail Q3 test 1\nErrors were generated on the following code:"
        print test1
    else:
        print "Pass Q3 test 1"
    print_sep()

    v1 = Variable('V1', [1, 2])
    v2 = Variable('V2', [1, 2])
    v3 = Variable('V3', [1, 2, 3, 4, 5])
    v4 = Variable('V4', [1, 2, 3, 4, 5])
    v5 = Variable('V5', [1, 2, 3, 4, 5])
    v6 = Variable('V6', [1, 3, 4, 5])
    v7 = Variable('V7', [1, 3, 4, 5])
    ac1 = AllDiffConstraint('1', [v1, v2, v3])
    ac2 = AllDiffConstraint('1', [v1, v2, v4])
    ac3 = AllDiffConstraint('1', [v1, v2, v5])
    ac4 = AllDiffConstraint('1', [v3, v4, v5, v6])
    ac5 = AllDiffConstraint('1', [v3, v4, v5, v7])
    vars = [v1, v2, v3, v4, v5, v6, v7]
    cnstrs = [ac1, ac2, ac3, ac4, ac5]
    testcsp = CSP('test2', vars, cnstrs)
    GacEnforce(cnstrs, testcsp, None, None)

    test2 = "    v1 = Variable('V1', [1, 2])\n\
    v2 = Variable('V2', [1, 2])\n\
    v3 = Variable('V3', [1, 2, 3, 4, 5])\n\
    v4 = Variable('V4', [1, 2, 3, 4, 5])\n\
    v5 = Variable('V5', [1, 2, 3, 4, 5])\n\
    v6 = Variable('V6', [1, 3, 4, 5])\n\
    v7 = Variable('V7', [1, 3, 4, 5])\n\
    ac1 = AllDiffConstraint('1', [v1,v2,v3])\n\
    ac2 = AllDiffConstraint('1', [v1,v2,v4])\n\
    ac3 = AllDiffConstraint('1', [v1,v2,v5])\n\
    ac4 = AllDiffConstraint('1', [v3,v4,v5,v6])\n\
    ac5 = AllDiffConstraint('1', [v3,v4,v5,v7])\n\
    vars = [v1, v2, v3, v4, v5, v6, v7]\n\
    cnstrs = [ac1,ac2,ac3,ac4,ac5]\n\
    testcsp = CSP('test2', vars, cnstrs)\n\
    GacEnforce(cnstrs, testcsp, None, None)"

    soln_doms = [
        set([1, 2]),
        set([1, 2]),
        set([3, 4, 5]),
        set([3, 4, 5]),
        set([3, 4, 5]),
        set([1]),
        set([1])
    ]

    #v1.pruneValue(1, None, None)

    for i, v in enumerate(vars):
        if set(v.curDomain()) != soln_doms[i]:
            fails[1] = True
            print "Error: {}.curDomain() == {}".format(v.name(), v.curDomain())
            print "Correct curDomin should be == {}".format(list(soln_doms[i]))

    if fails[1]:
        print "\nFail Q3 test 2\nErrors were generated on the following code:"
        print test2
    else:
        print "Pass Q3 test 2"
    print_sep()

    csp = sudokuCSP(b1, 'neq')
    GacEnforce(csp.constraints(), csp, None, None)
    vars = csp.variables()
    vars.sort(key=lambda var: var.name())
    soln_doms = [
        set([3]),
        set([1]),
        set([2]),
        set([5]),
        set([9]),
        set([8]),
        set([7]),
        set([6]),
        set([4]),
        set([9]),
        set([4]),
        set([6]),
        set([7]),
        set([3]),
        set([1]),
        set([2]),
        set([5]),
        set([8]),
        set([8]),
        set([7]),
        set([5]),
        set([4]),
        set([2]),
        set([6]),
        set([9]),
        set([1]),
        set([3]),
        set([5]),
        set([6]),
        set([7]),
        set([8]),
        set([4]),
        set([2]),
        set([3]),
        set([9]),
        set([1]),
        set([4]),
        set([8]),
        set([1]),
        set([3]),
        set([6]),
        set([9]),
        set([5]),
        set([7]),
        set([2]),
        set([2]),
        set([9]),
        set([3]),
        set([1]),
        set([7]),
        set([5]),
        set([4]),
        set([8]),
        set([6]),
        set([1]),
        set([3]),
        set([8]),
        set([2]),
        set([5]),
        set([7]),
        set([6]),
        set([4]),
        set([9]),
        set([6]),
        set([5]),
        set([4]),
        set([9]),
        set([1]),
        set([3]),
        set([8]),
        set([2]),
        set([7]),
        set([7]),
        set([2]),
        set([9]),
        set([6]),
        set([8]),
        set([4]),
        set([1]),
        set([3]),
        set([5])
    ]

    #vars[0].pruneValue(3, None, None)

    for i, v in enumerate(vars):
        if set(v.curDomain()) != soln_doms[i]:
            fails[2] = True
            print "Error: {}.curDomain() == {}".format(v.name(), v.curDomain())
            print "Correct curDomin should be == {}".format(list(soln_doms[i]))

    if fails[2]:
        print "\nFail Q3 test 3\nErrors were generated on the following code:"
        print "python2.7 sudoku.py -e -m neq 1"
    else:
        print "Pass Q3 test 3"
    print_sep()

    csp = sudokuCSP(b5, 'neq')
    GacEnforce(csp.constraints(), csp, None, None)
    vars = csp.variables()
    vars.sort(key=lambda var: var.name())
    soln_doms = [
        set([2, 4, 5, 8]),
        set([6]),
        set([2, 4, 5, 8]),
        set([1]),
        set([2, 5, 8]),
        set([3, 8]),
        set([7, 9]),
        set([3, 5, 7, 8]),
        set([3, 7, 8, 9]),
        set([1, 2, 5, 8]),
        set([1, 2, 5, 8]),
        set([7]),
        set([2, 3, 9]),
        set([2, 5, 6, 8]),
        set([3, 6, 8]),
        set([1, 6, 9]),
        set([3, 5, 6, 8]),
        set([4]),
        set([1, 5, 8]),
        set([9]),
        set([3]),
        set([4]),
        set([7]),
        set([6, 8]),
        set([1, 6]),
        set([5, 6, 8]),
        set([2]),
        set([2, 4, 8]),
        set([2, 4, 7, 8]),
        set([1]),
        set([6]),
        set([3]),
        set([9]),
        set([2, 4, 7]),
        set([2, 4, 7]),
        set([5]),
        set([5, 9]),
        set([5, 7]),
        set([5, 6, 9]),
        set([8]),
        set([4]),
        set([2]),
        set([1, 6, 7, 9]),
        set([3, 6, 7]),
        set([1, 3, 6, 7, 9]),
        set([3]),
        set([2, 4]),
        set([2, 4, 6, 9]),
        set([5]),
        set([1]),
        set([7]),
        set([8]),
        set([2, 4, 6]),
        set([6, 9]),
        set([6]),
        set([2, 4, 5, 8]),
        set([2, 4, 5, 8]),
        set([2, 7]),
        set([9]),
        set([4, 8]),
        set([3]),
        set([1]),
        set([7, 8]),
        set([7]),
        set([1, 2, 3, 4, 8]),
        set([2, 4, 8, 9]),
        set([2, 3]),
        set([2, 6, 8]),
        set([1, 3, 4, 6, 8]),
        set([5]),
        set([2, 4, 6, 8]),
        set([6, 8]),
        set([1, 2, 4, 8]),
        set([1, 2, 3, 4, 8]),
        set([2, 4, 8]),
        set([2, 3, 7]),
        set([2, 6, 8]),
        set([5]),
        set([2, 4, 6, 7]),
        set([9]),
        set([6, 7, 8])
    ]

    #vars[0].pruneValue(2, None, None)

    for i, v in enumerate(vars):
        if set(v.curDomain()) != soln_doms[i]:
            fails[3] = True
            print "Error: {}.curDomain() == {}".format(v.name(), v.curDomain())
            print "Correct curDomin should be == {}".format(list(soln_doms[i]))

    if fails[3]:
        print "\nFail Q3 test 4\nErrors were generated on the following code:"
        print "python2.7 sudoku.py -e -m neq 5"
    else:
        print "Pass Q3 test 4"
    print_sep()

    v1 = Variable('V1', [1, 2])
    v2 = Variable('V2', [1, 2])
    v3 = Variable('V3', [1, 2, 3, 4, 5])
    v4 = Variable('V4', [1, 2, 3, 4, 5])
    v5 = Variable('V5', [1, 2, 3, 4, 5])
    v6 = Variable('V6', [1, 3, 4, 5])
    v7 = Variable('V7', [1, 3, 4, 5])
    ac1 = AllDiffConstraint('1', [v1, v2, v3])
    ac2 = AllDiffConstraint('1', [v1, v2, v4])
    ac3 = AllDiffConstraint('1', [v1, v2, v5])
    ac4 = AllDiffConstraint('1', [v3, v4, v5, v6])
    ac5 = AllDiffConstraint('1', [v3, v4, v5, v7])
    neq = NeqConstraint('2', [v6, v7])
    vars = [v1, v2, v3, v4, v5, v6, v7]
    cnstrs = [ac1, ac2, ac3, ac4, ac5, neq]
    testcsp = CSP('test2', vars, cnstrs)
    val = GacEnforce(cnstrs, testcsp, None, None)

    test5 = "    v1 = Variable('V1', [1, 2])\n\
    v2 = Variable('V2', [1, 2])\n\
    v3 = Variable('V3', [1, 2, 3, 4, 5])\n\
    v4 = Variable('V4', [1, 2, 3, 4, 5])\n\
    v5 = Variable('V5', [1, 2, 3, 4, 5])\n\
    v6 = Variable('V6', [1, 3, 4, 5])\n\
    v7 = Variable('V7', [1, 3, 4, 5])\n\
    ac1 = AllDiffConstraint('1', [v1,v2,v3])\n\
    ac2 = AllDiffConstraint('1', [v1,v2,v4])\n\
    ac3 = AllDiffConstraint('1', [v1,v2,v5])\n\
    ac4 = AllDiffConstraint('1', [v3,v4,v5,v6])\n\
    ac5 = AllDiffConstraint('1', [v3,v4,v5,v7])\n\
    neq = NeqConstraint('2', [v6,v7])\n\
    vars = [v1, v2, v3, v4, v5, v6, v7]\n\
    cnstrs = [ac1,ac2,ac3,ac4,ac5]\n\
    testcsp = CSP('test2', vars, cnstrs)\n\
    val = GacEnforce(cnstrs, testcsp, None, None)"

    #val = 'fo'

    if val != "DWO":
        fails[4] = True
        print "Error: GacEnforce failed to return \"DWO\" returned {} instead".format(
            val)

    if fails[4]:
        print "\nFail Q3 test 5\nErrors were generated on the following code:"
        print test5
    else:
        print "Pass Q3 test 5"
    print_sep()

    csp = nQueens(8, False)
    solutions, num_nodes = bt_search('GAC', csp, 'fixed', False, False)
    errors = csp.check(solutions)

    if len(errors) > 0:
        fails[5] = True
        print "Fail Q3 test 6: invalid solution(s) returned by GAC"
        for err in errors:
            print_soln(err[0])
            print "\n", err[1]

    if len(solutions) != 1:
        fails[5] = True
        print "Fail Q3 test 6: GAC failed to return only one solution"
        print "  returned: "
        for s in solutions:
            print_soln(s)
            print ""
    ok = True
    for v in csp.variables():
        if set(v.curDomain()) != set(v.domain()):
            fails[5] = True
            print "Fail Q3 test 6: GAC failed to restore domains of variables"

    if not fails[5]:
        print "Pass Q3 test 6"
    print_sep()

    csp = nQueens(8, False)
    solutions, num_nodes = bt_search('GAC', csp, 'fixed', True, False)
    errors = csp.check(solutions)

    if len(errors) > 0:
        fails[6] = True
        print "Fail Q3 test 7: invalid solution(s) returned by GAC"
        for err in errors:
            print_soln(err[0])
            print "\n", err[1]

    if len(solutions) != 92:
        fails[6] = True
        print "Fail Q3 test 7: GAC failed to return 92 solutions"
        print "  returned {} solutions".format(len(solutions))

    ok = True
    for v in csp.variables():
        if set(v.curDomain()) != set(v.domain()):
            fails[6] = True
            print "Fail Q3 test 7: GAC failed to restore domains of variables"

    if not fails[7]:
        print "Pass Q3 test 7"
    print_sep()

    grades[2] = 0
    if sum(fails[:4]) == 0:
        grades[2] += 3
        if not fails[4]:
            grades[2] += 1
        if grades[2] >= 3:
            if sum([fails[5], fails[6]]) == 0:
                grades[2] += 3
def question_4():
    print_title(3)
    tested[3] = True
    fails = [False, False]
    if not tested[2]:
        print_sep('=')
        print "Q4 depends on Q3, running Q3 tests"
        question_3()
        print_sep('=')

    if grades[2] == 0:
        grades[3] = 0
        print "Q3 failed, cannot mark Q4"
        return

    csp = sudokuCSP(b5, 'alldiff')
    GacEnforce(csp.constraints(), csp, None, None)
    vars = csp.variables()
    vars.sort(key=lambda var: var.name())
    soln_doms = [
        set([2]),
        set([6]),
        set([4]),
        set([1]),
        set([5]),
        set([8]),
        set([9]),
        set([7]),
        set([3]),
        set([1]),
        set([8]),
        set([7]),
        set([9]),
        set([2]),
        set([3]),
        set([6]),
        set([5]),
        set([4]),
        set([5]),
        set([9]),
        set([3]),
        set([4]),
        set([7]),
        set([6]),
        set([1]),
        set([8]),
        set([2]),
        set([8]),
        set([7]),
        set([1]),
        set([6]),
        set([3]),
        set([9]),
        set([4]),
        set([2]),
        set([5]),
        set([9]),
        set([5]),
        set([6]),
        set([8]),
        set([4]),
        set([2]),
        set([7]),
        set([3]),
        set([1]),
        set([3]),
        set([4]),
        set([2]),
        set([5]),
        set([1]),
        set([7]),
        set([8]),
        set([6]),
        set([9]),
        set([6]),
        set([2]),
        set([5]),
        set([7]),
        set([9]),
        set([4]),
        set([3]),
        set([1]),
        set([8]),
        set([7]),
        set([3]),
        set([9]),
        set([2]),
        set([8]),
        set([1]),
        set([5]),
        set([4]),
        set([6]),
        set([4]),
        set([1]),
        set([8]),
        set([3]),
        set([6]),
        set([5]),
        set([2]),
        set([9]),
        set([7])
    ]

    #vars[0].pruneValue(3, None, None)

    for i, v in enumerate(vars):
        if set(v.curDomain()) != soln_doms[i]:
            fails[0] = True
            print "Error: {}.curDomain() == {}".format(v.name(), v.curDomain())
            print "Correct curDomin should be == {}".format(list(soln_doms[i]))

    if fails[0]:
        print "\nFail Q4 test 1\nErrors were generated on the following code:"
        print "python2.7 sudoku.py -e -m alldiff 5"
    else:
        print "Pass Q4 test 1"
        print_sep()

    csp = sudokuCSP(b6, 'alldiff')
    GacEnforce(csp.constraints(), csp, None, None)
    vars = csp.variables()
    vars.sort(key=lambda var: var.name())
    soln_doms = [
        set([7]),
        set([9]),
        set([2]),
        set([1]),
        set([6]),
        set([5]),
        set([4, 8]),
        set([4, 8]),
        set([3]),
        set([3]),
        set([4, 8]),
        set([4, 8]),
        set([9]),
        set([2]),
        set([7]),
        set([5]),
        set([6]),
        set([1]),
        set([6]),
        set([5]),
        set([1]),
        set([8]),
        set([4]),
        set([3]),
        set([9]),
        set([2]),
        set([7]),
        set([4, 8]),
        set([3, 4, 7, 8]),
        set([6]),
        set([4, 7]),
        set([1]),
        set([9]),
        set([3, 4, 8]),
        set([5]),
        set([2]),
        set([9]),
        set([3, 4, 7]),
        set([4, 5, 7]),
        set([2]),
        set([5, 7]),
        set([8]),
        set([1, 3, 4]),
        set([1, 3, 4]),
        set([6]),
        set([1]),
        set([2]),
        set([4, 5, 8]),
        set([4, 5]),
        set([3]),
        set([6]),
        set([7]),
        set([4, 8, 9]),
        set([4, 9]),
        set([4, 5]),
        set([1]),
        set([3]),
        set([5, 6, 7]),
        set([8]),
        set([2]),
        set([4, 6]),
        set([4, 7, 9]),
        set([4, 9]),
        set([2, 5]),
        set([6]),
        set([9]),
        set([3, 5, 7]),
        set([5, 7]),
        set([4]),
        set([1, 2, 3]),
        set([1, 3, 7]),
        set([8]),
        set([2, 4, 8]),
        set([4, 7, 8]),
        set([4, 7, 8]),
        set([3, 6, 7]),
        set([9]),
        set([1]),
        set([2, 3, 4, 6]),
        set([3, 4, 7]),
        set([5])
    ]
    #vars[0].pruneValue(2, None, None)

    for i, v in enumerate(vars):
        if set(v.curDomain()) != soln_doms[i]:
            fails[1] = True
            print "Error: {}.curDomain() == {}".format(v.name(), v.curDomain())
            print "Correct curDomin should be == {}".format(list(soln_doms[i]))

    if fails[1]:
        print "\nFail Q4 test 2\nErrors were generated on the following code:"
        print "python2.7 sudoku.py -e -m alldiff 6"
    else:
        print "Pass Q4 test 1"
        print_sep()

    if any(fails):
        grades[3] = 0
    else:
        grades[3] = outof[3]
Example #3
0
    if args.b < 1 or args.b > len(boards):
        print "{} is invalid board number. I only know about boards {} to {}".format(
            args.b, 1, len(boards))
        print "If you want to add new boards add them to the list \"boards\""
        exit(1)

    ib = boards[args.b - 1]
    print "=" * 66
    print "Solving board {}".format(args.b)
    for row in ib:
        print row
    print "-" * 60

    if args.gacEnforce:
        print "Applying GAC enforce only using {} model".format(args.model)
        csp = csp_problems.sudokuCSP(ib, args.model)
        backtracking.GacEnforce(csp.constraints(), csp, None,
                                None)  #GAC at the root
        vars = csp.variables()
        vars.sort(key=lambda var: var.name())

        print "[",
        for v in vars:
            print "set({}),".format(v.curDomain()),
        print "]"

        var_array = [vars[i:i + 9] for i in range(0, len(vars), 9)]
        for row in var_array:
            print "[",
            for v in row:
                print v.curDomain(),