/* Binary matrix to number in Picat. binmatrix2num channels between a binary matrix and a list of numbers. This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go ?=> N = 5, X = new_array(N,N), X :: 0..1, NumList = new_list(N), NumList :: 1..N, binmatrix2num(X, NumList), Vars = X.vars ++ NumList, solve(Vars), println(numList=NumList), foreach(Row in X) println(Row) end, nl, fail, nl. go => true. % % IP version % go2 ?=> N = 5, X = new_array(N,N), X :: 0..1, NumList = new_list(N), NumList :: 1..N, binmatrix2num_ip(X, NumList), Vars = X.vars ++ NumList, solve(Vars), println(numList=NumList), foreach(Row in X) println(Row) end, nl, fail, nl. go2 => true. % % converts a binary matrix to a number array. % Requires support of <-> (i.e. not IP models) % binmatrix2num(X, Nums) => foreach(I in 1..X.len, J in 1..X[1].len) Nums[I] #= J #<=> X[I,J] #= 1 end. % % For IP models % binmatrix2num_ip(X, Nums) => Rows = X.len, Cols = X[1].len, foreach(I in 1..Rows) Nums[I] #= sum([J*X[I,J] : J in 1..Cols]), sum([X[I,J] : J in 1..Cols]) #= 1 end.