1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import sys def transform(infile,outfile,solfile = None ): with open (infile, 'r' ) as f: with open (outfile, 'w' ) as out: def readInts(txt,n): line = f.readline().split( ":" ) if line[ 0 ] = = txt: return list ( map ( int ,line[ 1 ].split())) else : print (line, "!=" ,txt) def readInt(txt): line = f.readline().split( ":" ) if line[ 0 ] = = txt: return int (line[ 1 ]) else : print (line, "!=" ,txt) def readHeader(txt): line = f.readline().split( ":" ) if line[ 0 ] = = txt: return line[ 1 ] else : print (line, "!=" ,txt) def readEmpty(): line = f.readline().strip() if line ! = "": print (line, "!= " ) print ( "%" ,readHeader( "DESCRIPTION" ), file = out) ny = readInt( "YEARS" ) npy = readInt( "PERIODS_PER_YEAR" ) print ( "n_periods = " ,ny * npy, ";" , file = out) nc = readInt( "NUM_COURSES" ) print ( "n_courses = " ,nc, ";" , file = out) nq = readInt( "NUM_CURRICULA" ) print ( "n_curricula = " ,nq, ";" , file = out) mm = readInts( "MIN_MAX_COURSE_LOAD_PER_PERIOD" , 2 ) print ( "min_courses = " ,mm[ 0 ], ";" , file = out) print ( "max_courses = " ,mm[ 1 ], ";" , file = out) np = readInt( "NUM_PRECEDENCES" ) print ( "n_precedences = " ,np, ";" , file = out) nu = readInt( "NUM_UNDESIRED_PERIODS" ) print ( "n_undesirables = " ,nu * ny, ";" , file = out) print ( "w1 = 1;" , file = out) print ( "w2 = 1;" , file = out) readEmpty() readHeader( "COURSES" ) courses = {} loads = [] for i in range ( 1 ,nc + 1 ): line = f.readline().split() course = line[ 0 ] load = int (line[ 1 ]) courses[course] = i loads + = [load] print ( "course_load = " ,loads, ";" , file = out) readEmpty() readHeader( "CURRICULA" ) curricula = [] for i in range ( 1 ,nq + 1 ): line = f.readline().split() cur = line[ 0 ] n_c = int (line[ 1 ]) curricula + = [ set ( map ( lambda c: courses[c],line[ 2 :]))] print ( "courses_of = " ,curricula, ";" , file = out) readEmpty() readHeader( "PRECEDENCES" ) precedences = [] for i in range ( 1 ,np + 1 ): line = f.readline().split() precedences + = [courses[line[ 0 ]],courses[line[ 1 ]]] print ( "precedes = array2d(precedences,1..2," ,precedences, ");" , file = out) readEmpty() readHeader( "UNDESIRED_PERIODS" ) undesired = [] for i in range ( 1 ,nu + 1 ): line = f.readline().split() for y in range ( 0 ,ny): undesired + = [courses[line[ 0 ]], int (line[ 1 ]) + 1 + y * npy] print ( "undesirable = array2d(undesirables,1..2," ,undesired, ");" , file = out) readEmpty() print ( "%" ,courses, file = out) print (f.readline()) if not solfile is None : with open (solfile, 'r' ) as s: fixed = [] for i in range (nc): line = s.readline().split() fixed + = [courses[line[ 0 ]], int (line[ 1 ]) + 1 ] print ( "n_fixed = n_courses;" , file = out) print ( "fixed = array2d(courses,1..2," ,fixed, ");" , file = out) else : print ( "n_fixed = 0;" , file = out) print ( "fixed = array2d(1..0,1..2,[]);" , file = out) if __name__ = = "__main__" : if len (sys.argv) > 2 : fname = sys.argv[ 1 ] transform(fname,fname + ".dzn" ,sys.argv[ 2 ]) elif len (sys.argv) > 1 : fname = sys.argv[ 1 ] transform(fname,fname + ".dzn" ) else : print ( "give the name of the file to transform" ) |