examples: add example program demonstrating sync entry methods
[charm.git] / examples / charm++ / NQueen / main.C
1 /*
2  * N Queen solver 
3  * Feb 1st
4  *
5  * Copyright by PPL
6  * problem report sun51@uiuc.edu
7 */
8
9 #include "main.decl.h"
10 #include "main.h"
11 #include "nqueen.h"
12 #include "counter.h"
13
14 Main::Main(CkArgMsg* msg)
15 {
16
17     //CkPrintf(" Usage: nqueen Num\n");
18
19     numQueens = 5;
20     grainsize = 3;
21     if(msg->argc > 2)
22     {
23         numQueens = atoi(msg->argv[1]);
24         grainsize = atoi(msg->argv[2]);   
25     }
26     delete msg;
27
28     CkPrintf(" Usage: nqueen numQueen grainsize (%d, g=%d, np=%d)\n", numQueens, grainsize, CkNumPes());
29
30     /* timer */
31     mainhandle=thishandle;
32     
33     
34     int odd = numQueens&1;
35     int board_minus = numQueens - 1;
36     mask = (1<<numQueens) - 1;
37     int bitfield = 0;
38     int half = numQueens >> 1;
39     int numrows = 1;
40     int col;
41     int pos;
42     int neg;
43     int lsb;
44
45     bitfield  = (1 << half) -1;
46     for(;;)
47     {
48         if(bitfield == 0)
49             break;
50         lsb = -((signed)bitfield) & bitfield; 
51         QueenState *qmsg = new QueenState;
52         qmsg->aQueenBitRes= lsb;
53         qmsg->aQueenBitCol = 0|lsb;
54         qmsg->aQueenBitNegDiag = (0|lsb) >> 1;
55         qmsg->aQueenBitPosDiag = (0|lsb) << 1;
56         qmsg->numrows = 1; 
57         //CkSetQueueing(qmsg, CK_QUEUEING_ILIFO);
58         CProxy_NQueen::ckNew(qmsg);
59         bitfield &= ~lsb;
60     }
61
62     if(odd == 1)
63     {
64         bitfield = 1 << (numQueens >> 1);
65         numrows = 1; /* prob. already 0 */
66         /* The first row just has one queen (in the middle column).*/
67         //aQueenBitRes[0] = bitfield;
68         //aQueenBitCol[0] = aQueenBitPosDiag[0] = aQueenBitNegDiag[0] = 0;
69         col = bitfield;
70         /* Now do the next row.  Only set bits in half of it, because we'll
71          * * * *                flip the results over the "Y-axis".  */
72         neg = (bitfield >> 1);
73         pos = (bitfield << 1);
74         bitfield = (bitfield - 1) >> 1;
75         for(;;)
76         {
77             if(bitfield == 0)
78                 break;
79             lsb = -((signed)bitfield) & bitfield; 
80
81             QueenState *qmsg = new QueenState;
82             qmsg->aQueenBitRes = lsb;
83             qmsg->aQueenBitCol = col|lsb;
84             qmsg->aQueenBitNegDiag = (neg|lsb)>>1;
85             qmsg->aQueenBitPosDiag = (pos|lsb)<<1;
86             qmsg->numrows = 2; 
87             //CkSetQueueing(qmsg, CK_QUEUEING_ILIFO);
88             CProxy_NQueen::ckNew(qmsg);
89             bitfield &= ~lsb;
90         }
91     }
92     starttimer = CkWallTimer();//CkTimer();
93     counterGroup = counterInit();
94     CkStartQD(CkIndex_Main::Quiescence1((DUMMYMSG *)0), &mainhandle);
95 }
96
97 Main::Main(CkMigrateMessage* msg) {}
98
99 void Main::Quiescence1(DUMMYMSG *msg)
100 {
101     int numSolutions = CProxy_counter(counterGroup).ckLocalBranch()->getTotalCount();
102     double endtimer = CkWallTimer();
103     CkPrintf("There are %d Solutions to %d queens. Time=%f End time=%f\n",
104         2*numSolutions, numQueens, endtimer-starttimer, CkWallTimer());
105     CkExit();
106 }
107
108 #include "main.def.h"