5 * Revision 1.1.1.1 1996/04/01 15:02:57 mclareni
10 SUBROUTINE GRAPH(H, IE, INOD, ISL, NPTR, NISL)
12 C DESCRIPTION OF PARAMETERS
14 C H(3,96) INP MUST CONTAIN THE INCIDENCE-MATRIX OF THE GRAPH IN
15 C BIT FORMAT, I.E. THE MATRIX IS PACKED INTO A BITSTRIN
16 C (USE *SETBIT* FOR THIS PURPOSE.
17 C CALLING SEQUENCE IS 'CALL SETBIT(N, A, BIT)'
18 C SETS THE N-TH BIT OF STRING A (COUNTED FROM LEFT TO
19 C RIGHT) TO THE VALUE OF 'BIT' (0 OR 1))
20 C H(I,J) = 1 IF THERE'S AN EDGE FROM NODE I TO NODE J
22 C IE INP NUMBER OF EDGES IN THE GRAPH
23 C THIS VALUE IS USED FOR PLAUSIBILITY-CONTROL ONLY
24 C INOD INP NUMBER OF NODES IN THE GRAPH
25 C ISL(96) OUT ONE SOLUTION EXTRACTED OUT OF THE GRAPH
26 C IF H(I,J) REPRESENTS AN INCOMPATIBILITY GRAPH, THEN
27 C ISL(1) ... ISL(NPTR) CONTAINS THE REMAINING COMPATIBL
28 C NODES, IF THE NODES ISL(NPTR+1) ... ISL(NISL) ARE
29 C REMOVED FROM THE GRAPH.
30 C N O T E : ISL CONTAINS, HOWEVER, ONLY NODES WITHIN
31 C THE CURRENT SUBGRAPH, IF NISL WAS 0 IN THE FIRST CALL
32 C NPTR OUT CONFER *ISL*
33 C NISL I/O CONTROLS THE FLOW OF THE ROUTINE AND INDICATES
34 C THE TYPE OF RESULT ON OUTPUT.
35 C INPUT.. 0 IF H, IE, INOD DESCRIBE A NEW GRAPH, FROM WHICH TH
36 C FIRST SOLUTION OF ITS FIRST SUBGRAPH IS TO BE EXTR
37 C -1 THE GRAPH WON'T BE SPLIT UP INTO SUBGRAPHS. THE
38 C GRAPH IS THEREFORE TREATED AS A SINGLE SUBGRAPH
39 C INCLUDING ALL ITS ISOLATED NODES. IF THERE ARE
40 C MANY SUBGRAPHS, THEN THE NUMBER OF SOLUTIONS MAY
42 C 1 IF THE NEXT SOLUTION OF THE CURRENT SUBGRAPH IS TO
44 C 2 IF FURTHER SOLUTIONS OF THE CURRENT SUBGRAPH ARE T
45 C BE DROPPED AND THE NEXT SOLUTION OF THE NEXT SUBGR
47 C OUTPUT. -1 THERE'S NO FURTHER SOLUTION AVAILABLE IN THE GRAPH
48 C ('END-OF-GRAPH' - INDICATION)
49 C 0 LAST SOLUTION GIVEN WAS THE LAST ONE IN THE CURREN
50 C SUBGRAPH ('END-OF-SUBGRAPH' - INDICATION)
52 C IF NISL IS EQUAL TO 0 OR -1, THE CONTENTS OF ISL ARE
53 C UNDEFINED.(THERE'S NO SOLUTION STORED)
55 C WRONG CALLING SEQUENCE OR UNBELIEVABLE PARAMETER VALUES FORCE
56 C A RETURN WITH NISL = NPTR = -1. (ISL REMAINS UNDEFINED)
58 C DESCRIPTION OF IMPORTANT PROGRAM VARIABLES
60 C IV(3), IF(3) THESE TWO BITSTRINGS ARE USED BY THE ALGORITHM TO EXT
61 C SUBGRAPHS OUT OF THE GRAPH GIVEN (BY H, IE, INOD)
62 C IV(I)=1,IF(I)=0 NODE I HASN'T YET BEEN INVESTIGATED BY THE AL
63 C IV(I)=0,IF(I)=1 THIS NODE SURELY BELONGS TO THE SUBGRAPH NOW
64 C UNDER CONSTRUCTION AND THERE MIGHT BE EDGES LEADING
66 C IV(I)=0,IF(I)=0 THIS NODE (I) IS DEACTIVATED, I.E. ALL INCIDEN
67 C EDGES HAVE BEEN REMOVED AND ADDED TO THE SUBGRAPH.
68 C IPTR GIVES THE CURRENT LENGTH OF THE EDGE INCLUSION TABLE(EIT) WHI
69 C DESCRIBES THE SUBGRAPH. (THE EIT IS THEN PASSED TO *PGRAPH*
71 C IZ CONTROL VARIABLE FOR PGRAPH (SEE DESCRIPTION OF *PGRAPH*)
72 C NINFO, INFO(96) SINCE PGRAPH REQUIRES THE NODES OF THE DELIVERED GR
73 C TO BE SEQUENTIALLY NUMBERED, EACH SUBGRAPH GENERATED BY GRAPH
74 C MUST BE RENUMBERED, BEFORE IT IS PASSED TO PGRAPH. WHEN PGRAP
75 C RETURNS A SOLUTION, THE ORIGINAL NUMBERS OF THE NODES MUST BE
76 C RECONSTRUCTED PRIOR TO THE RETURN-TO-MAINLINE. TO PROVIDE
77 C THIS, FOR NODE I INFO(I) CONTAINS ITS SEQUENTIAL NUMBER WITHI
78 C THE SUBGRAPH. THE SEQU. NUMBER IS UPDATED IN NINFO.
87 COMMON /BITSXB/ NBITPW, NBYTPW
91 #if defined(CERNLIB_CDC)
95 #if defined(CERNLIB_NORD)
96 DATA IFILWD / 37777777777B/
99 #if (!defined(CERNLIB_DOUBLE))&&(!defined(CERNLIB_CDC))
103 #if (defined(CERNLIB_DOUBLE))&&(!defined(CERNLIB_NORD))
108 IF(NISL - 1) 999,555,111
110 C DO SOME ERROR CHECKING
111 C DON'T PROCESS GRAPH ON IMPROPER CALLING SEQUENCE
113 999 IF(IE.GT.652*(NBITPW/8)) GOTO 888
115 IF(INOD.GT.96) GOTO 888
116 IF(INOD.LE.1) GOTO 888
123 C CHECK, WHETHER TO SPLIT UP INTO SUBGRAPHS OR NOT.
125 IF(NISL.NE.-1) GOTO 666
137 CALL GETBIT(K, H(1,I), IBIT)
138 IF(IBIT.EQ.0) GOTO 40
139 CALL SETBIT(K, H(1,I), 0)
140 CALL SETBIT(I, H(1,K), 0)
142 CALL TUP(EIT(1,1), IPTR, I)
143 CALL TUP(EIT(1,2), IPTR, K)
145 IF(IPTR.EQ.0) GOTO 888
156 CALL UFILL(IV,1,3,IFILWD)
158 IF(NOLD.NE.0) GOTO 888
161 CALL UZERO(INFO, 1, INOD)
163 CALL GETBIT(I, IV, IBIT)
166 C THERE ARE NO FURTHER NODES LEFT IN THE GRAPH
170 C A NODE HAS BEEN FOUND. ALL ITS INCIDENT EDGES ARE DETERMINED,
171 C REMOVED FROM THE GRAPH AND STORED INTO THE EIT
174 CALL GETBIT(NODE, H(1,I), IBIT)
176 CALL SETBIT(NODE, H(1,I), 0)
177 CALL SETBIT(I, H(1,NODE), 0)
178 C MARK THIS ADJACENT NODE FOUND TO PROVIDE FURTHER EXPANSION
180 CALL SETBIT(I, IV, 0)
181 CALL SETBIT(I, IF, 1)
182 C STORE THE EDGE (NODE,I) INTO THE EIT
183 C REMARK.. THE FIRST 'CALL TUP(..)' MEANS EIT(IPTR,1) = NODE
185 CALL TUP(EIT(1,1), IPTR, NODE)
186 CALL TUP(EIT(1,2), IPTR, I)
188 C SET UP ARRAY TO PROVIDE SEQUENTIAL NUMBERING OF THE NODES OF
189 C EACH SUBGRAPH BEFORE ENTERING SUBROUTINE PGRAPH
192 C MARK THE NODE AS INACTIVE. (ALL INCIDENT EDGES HAVE BEEN REMOVED)
193 CALL SETBIT(NODE, IV, 0)
194 CALL SETBIT(NODE, IF, 0)
195 C IS THERE STILL A NODE IN THE GRAPH, FROM WHICH THE CURRENT
196 C SUBGRAPH MIGHT BE EXPANDED
198 CALL GETBIT(I, IF, IBIT)
201 C NO, THE SUBGRAPH IS COMPLETE. CHECK, IF IT IS ONLY AN ISOLATED NODE
208 C REARRANGE THE NUMBERS WITHIN THE SUBGRAPH FOUND TO BE SEQUENTIAL
212 JX = IGET(EIT(1,J), I)
214 CALL TUP(EIT(1,J), I, NEW)
218 555 IF(IZ.EQ.0) GOTO 111
219 556 CALL PGRAPH(EIT, IPTR, NINFO, ISL, NPTR, IZ)
221 IF(.NOT. SPLIT) GOTO 8
222 C RE-REARRANGE THE NUMBERS IN THE EIT FROM SEQUENTIAL TO ORIGINAL
226 IF(INFO(J).EQ.NEW) GOTO 12