//
//  WSN_GILP_isolate.cpp
//  WSN Orlando
//
//  Created by Farshid Hassani Bijarbooneh on 9/5/11.
//  Copyright 2011 Uppsala University. All rights reserved.
//

#include <gecode/driver.hh>
#include <gecode/int.hh>
#include <gecode/minimodel.hh>

#define GRID_SIZE 50
#define MASK_SIZE 7
#define GS	(MASK_SIZE-1+GRID_SIZE) //padded grid size
using namespace std;
using namespace Gecode;

int z_mask[MASK_SIZE*MASK_SIZE] = {18, 24, 28, 30, 28, 24, 18, 24, 32, 41, 45, 41, 32, 24, 28, 41, 57, 67, 57, 41, 28, 30, 45, 67, 100, 67, 45, 30, 28, 41, 57, 67, 57, 41, 28, 24, 32, 41, 45, 41, 32, 24, 18, 24, 28, 30, 28, 24, 18};

//// Small Instance GRID_SIZE = 20
//int R_matrix[GS][GS]= {
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0,70,68,65,63,57,56,56,56,58,62,64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0,70,67,64,61,53,50,45,34,16, 6, 0, 0, 1,16,39,57,62,65,67,69, 0, 0, 0,},
//    { 0, 0, 0,70,67,62,59,51,46, 9, 0, 0, 0, 0, 0, 0, 0,26,48,52,54,57,59, 0, 0, 0,},
//    { 0, 0, 0,70,66,61,58,50,45, 0, 0, 0, 0, 0, 0, 0, 0,17,41,45,48,51,55, 0, 0, 0,},
//    { 0, 0, 0,70,67,62,59,51,44, 0, 0, 0, 0, 0, 0, 0, 0,12,37,41,42,45,49, 0, 0, 0,},
//    { 0, 0, 0,70,67,64,61,53,46, 0, 0, 0, 0, 0, 0, 0, 0,15,39,41,40,40,44, 0, 0, 0,},
//    { 0, 0, 0,70,68,65,63,55,49, 0, 0, 0, 0, 0, 0, 0, 0,20,43,45,45,45,49, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0,66,59, 0, 0, 0, 0, 0, 0, 0, 0,28,48,49,49,51,53, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0,67,63,11, 0, 0, 0, 0, 0, 0,41,61,62,58,57,57,58, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0,69,67,66,52,47,42,40,42,48,52,64,66,65,64,65,66,66, 0, 0, 0,},
//    { 0, 0, 0,70,69,70,69,67,67,66,65,65,65,66,68,68,67,67,67,65,65,65,65, 0, 0, 0,},
//    { 0, 0, 0,69,69,69,69,69,70,69,69,69,69, 0, 0, 0,69,69,68,67,67,66,67, 0, 0, 0,},
//    { 0, 0, 0,70,69,70,69,69,70,69,69,69, 0, 0, 0, 0, 0, 0,69,68,68,68,68, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,69,69,69, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,70,70,70, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
//    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}};

//// Large instance GRID_SIZE = 50
int R_matrix[GS][GS] = {
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,67,67,66,65,66,67,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,68,65,63,57,56,56,56,58,62,64, 0, 0, 0, 0, 0, 0, 0,69,54,46,36,23,11, 0, 0, 0, 5,18,36,54, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,67,64,61,53,50,45,34,16, 6, 0, 0, 1,16,39,57,62,65,64,31,15, 0, 0, 0, 0, 0, 0, 0, 0,24,50, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,67,62,59,51,46, 9, 0, 0, 0, 0, 0, 0, 0,26,48,52,53,47, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,45, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,66,61,58,50,45, 0, 0, 0, 0, 0, 0, 0, 0,17,41,45,46,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,43, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,67,62,59,51,44, 0, 0, 0, 0, 0, 0, 0, 0,12,37,41,40,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,45, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,67,64,61,53,46, 0, 0, 0, 0, 0, 0, 0, 0,15,39,41,38,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,24,50, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,68,65,63,55,49, 0, 0, 0, 0, 0, 0, 0, 0,20,43,45,42,33, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,36,54, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,67,59,56,54,53,55,58,64, 0, 0, 0,66,59, 0, 0, 0, 0, 0, 0, 0, 0,28,48,49,46,39,22,14, 9, 0, 0, 0, 0, 0, 5,22, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,66,55,50,46,45,48,53,61, 0, 0, 0,67,63,11, 0, 0, 0, 0, 0, 0,41,61,62,58,54,49,46,45,46,21,18,16,18,20,28,40, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,65,51,43,35,33,40,48,59, 0, 0,69,67,66,52,47,42,40,42,48,52,64,66,65,64,64,63,62,61,60,46,43,41,42,45,51,55, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,64,49,39,23,17,34,46,58,69,70,69,67,67,66,65,65,65,66,68,68,67,67,67,65,64,62,61,60,60,61,64,66,68,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,64,50,42,33,30,38,47,58,69,69,69,69,70,69,69,69,69, 0, 0, 0,69,69,68,67,66,64,63,62,63,64,66,67,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,64,53,47,43,42,45,51,60,69,70,69,69,70,69,69,69, 0, 0, 0, 0, 0, 0,69,68,67,66,65,65,65,66,67,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0,69,69,69,65,56,52,49,49,52,55,62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,69,68,67,67,67,67,68,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0,69,69,69,69,69,68,67,67,66,66,67,68,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,69,69,69,68,69,69,67,68,67,67,68,68,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,69,69,69,68,69,69,68,68,68,68,69,69,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0,70,69,68,69,69,69,69,69,69,69,69,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0,69,69,69,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}};

class WSN : public MinimizeScript {
	
public:
	
	IntVarArray B;
	IntVar Sum;
	
	WSN(const SizeOptions& opt)
    : B(*this, GS*GS, 0, 1)
	, Sum(*this, 0, GS*GS)
	{
		int i,j,k,l,tempX,tempY;
        
        /// objective function
        linear(*this, B, IRT_EQ, Sum,opt.icl());
        
        IntArgs z(MASK_SIZE*MASK_SIZE,z_mask);
        
        /// All the inequality constraint for cells
        for (i=0; i<GS; i++) {
            for (j=0; j<GS; j++) {
                if (i>=MASK_SIZE/2 && i<MASK_SIZE/2+GRID_SIZE && j>=MASK_SIZE/2 && j<MASK_SIZE/2+GRID_SIZE) {
                    IntVarArgs B_args(MASK_SIZE*MASK_SIZE); // if i,j are NOT in padded area
                    for (k=0; k<MASK_SIZE; k++) {
                        for (l=0; l<MASK_SIZE; l++) {
                            tempX = k + i - MASK_SIZE/2;
                            tempY = l + j - MASK_SIZE/2;
                            B_args[k*MASK_SIZE+l] = B[tempX*GS+tempY]; // project a square of size MASK_SIZE from the 2D version of B
                        }
                    }
                    linear(*this, z, B_args, IRT_GQ, R_matrix[i][j],opt.icl());
                }
                else{
                    rel(*this, B[i*GS+j]==0); // if i,j are in padded area
                }
            }
        }
		
		// Install branching
		branch(*this, B, INT_VAR_NONE, INT_VAL_MIN); 
	}
    
    virtual IntVar 
    cost(void) const { return Sum; }
	
	WSN(bool share, WSN& sp) :
    MinimizeScript(share,sp)
	{
		B.update(*this, share, sp.B);
		Sum.update(*this, share, sp.Sum);
	}
	/// Copy space during cloning
	virtual Space*
	copy(bool share) 
	{
		return new WSN(share,*this);
	}
	
	/// Print solution
	virtual void
	print(std::ostream& os) const {
//        Matrix<IntVarArray> B_m(B,GS,GS);
        for (int i=0; i<GS; i++) {
            for (int j=0; j<GS; j++) {
                cout << B[i*GS+j] << ",";
            }
            cout << endl;
        }
        cout << endl;
//		cout << B_m << endl;
        cout << "Objective value: " << Sum << endl;
	}};

int
main(int argc, char* argv[]) {
    
    SizeOptions opt("WSN ILP MODEL");
    opt.solutions(0);
    opt.icl(ICL_VAL); // DOM is not friendly at all!
    opt.threads(2);
    opt.time(10*60000);
    opt.parse(argc,argv);
    
    MinimizeScript::run<WSN,BAB,SizeOptions>(opt);
    return 0;
}



