尝试打印结果时出现 MiniZinc 类型错误
MiniZinc type error for trying to print the result
我正在草拟 r600g 驱动程序中的 bank swizzles 调度 (它是 inefficient ATM,我正在弄清楚约束条件):
enum CHANS = {x,y,z,w};
enum REGS = {R1, R2, R3, R4}; % for starters
% args
enum OPERANDS = {src1, src2, src3, src4};
array[OPERANDS] of REGS: Regs = [R1, R2, R1, R3];
array[OPERANDS] of CHANS: Chans = [x, x, y, x];
array[OPERANDS] of 1..4: Inst = [1,1,2,2];
array[OPERANDS] of 1..3: Port = [1,2,1,2];
% the rest
array[OPERANDS] of var 1..3: PortOut;
constraint sum(i in PortOut where i = 1)(1) <= 3;
constraint sum(i in PortOut where i = 2)(1) <= 3;
constraint sum(i in PortOut where i = 3)(1) <= 3;
output [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where PortOut[op] == 1]
++ [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where PortOut[op] == 2]
++ [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where PortOut[op] == 3];
solve satisfy;
它适用于注释掉的 3 "output" 行,但除此之外它会失败:
λ minizinc test.mzn
test.mzn:17:
MiniZinc: type error: invalid type in output item, expected `array[int] opt string'
有什么想法吗?
当您在 output
部分使用决策变量时,您(可能)必须使用 fix
来使用变量的值。这里 PortOut[op]
需要被 fix
编辑:
output [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where fix(PortOut[op]) == 1]
++ [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where fix(PortOut[op]) == 2]
++ [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where fix(PortOut[op]) == 3];
我正在草拟 r600g 驱动程序中的 bank swizzles 调度 (它是 inefficient ATM,我正在弄清楚约束条件):
enum CHANS = {x,y,z,w};
enum REGS = {R1, R2, R3, R4}; % for starters
% args
enum OPERANDS = {src1, src2, src3, src4};
array[OPERANDS] of REGS: Regs = [R1, R2, R1, R3];
array[OPERANDS] of CHANS: Chans = [x, x, y, x];
array[OPERANDS] of 1..4: Inst = [1,1,2,2];
array[OPERANDS] of 1..3: Port = [1,2,1,2];
% the rest
array[OPERANDS] of var 1..3: PortOut;
constraint sum(i in PortOut where i = 1)(1) <= 3;
constraint sum(i in PortOut where i = 2)(1) <= 3;
constraint sum(i in PortOut where i = 3)(1) <= 3;
output [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where PortOut[op] == 1]
++ [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where PortOut[op] == 2]
++ [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where PortOut[op] == 3];
solve satisfy;
它适用于注释掉的 3 "output" 行,但除此之外它会失败:
λ minizinc test.mzn
test.mzn:17:
MiniZinc: type error: invalid type in output item, expected `array[int] opt string'
有什么想法吗?
当您在 output
部分使用决策变量时,您(可能)必须使用 fix
来使用变量的值。这里 PortOut[op]
需要被 fix
编辑:
output [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where fix(PortOut[op]) == 1]
++ [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where fix(PortOut[op]) == 2]
++ [show(Regs[op]) ++ "." ++ show(Chans[op]) ++ " " | op in OPERANDS where fix(PortOut[op]) == 3];