src/work/marci/oldies/marci_graph_concept.txt
author klao
Wed, 09 Mar 2005 14:23:36 +0000
changeset 1209 dc9fdf77007f
permissions -rw-r--r--
Fix a bug noticed by deba.
marci@280
     1
ETIK-OL-NOLIB-NEGRES graph concept-ek.
marci@280
     2
marci@280
     3
 Ebben a dokumentacioban graph concept tervek es azok megvalositasarol irok. 
marci@280
     4
A felsorolt rutinok, osztalyok egyaltalan nem kikristalyosodottak, 1-1 elemi 
marci@280
     5
operacio elvegzesere gyakran tobb mod is rendelkezesre all. A tervezesi fazisban pont annak kell kiderulnie, hogy milyen metodusok tavolithatok el, s milyen 
marci@280
     6
ujakra van szukseg. 
marci@280
     7
marci@280
     8
 Megvalositottunk egy graph osztalyt mely listaban tarolja a pontokat, 
marci@280
     9
az 1 pontbol kiindulo eleket, s az 1 pontba bemeno eleket. Konstrualni lehet 
marci@280
    10
ures grafot, hozzaadni pontokat, eleket. Az incidenciat node_iteratorok-kal 
marci@280
    11
ill. edge_iteratorokkal lehet megfigyelni. Adott tovabba 1 template osztaly, 
marci@280
    12
a graf pontjaihoz vagy eleihez tetszoleges tipusu property hozzarendelesere, 
marci@280
    13
a jelen megvalositas ezeket vektorben tarolja. Fontos azonban, hogy ezen 
marci@280
    14
property_vector csak azokra a graf-objektumokra ervenyes, melyek 
marci@280
    15
letrehozasanak pillanataban a grafhoz tartoznak. 
marci@280
    16
marci@280
    17
marci_bfs.hh	      //bfs, tejesen kiserleti
marci@280
    18
marci_graph_demo.cc  //peldaprogi a lisas graf hasznalatahoz
marci@280
    19
marci_list_graph.hh  //list_graph megvalositas
marci@280
    20
marci_max_flow.hh     //folyam, kiserleti
marci@280
    21
marci_property_vector.hh //property vector megvalosites indexelt grafokhoz	
marci@280
    22
graf es iterator tipusok:
marci@280
    23
marci@280
    24
class list_graph;	 
marci@280
    25
marci@280
    26
class node_iterator;      
marci@280
    27
trivialis node iterator, csak cimezni lehet vele, pl property vectort
marci@280
    28
marci@280
    29
class each_node_iterator;
marci@280
    30
node iterator a graf pontjainak bejarasara, node_iterator-ra konvertalhato
marci@280
    31
marci@280
    32
class edge_iterator;
marci@280
    33
trivialis edge iterator, csak cimezni lehet vele, pl property vectort
marci@280
    34
marci@280
    35
class each_edge_iterator;
marci@280
    36
edge iterator a graf osszes elenek bejarasara
marci@280
    37
marci@280
    38
class out_edge_iterator;
marci@280
    39
edge iterator 1 pont ki eleinek bejarasara, edge_iterator-ra konvertalhato
marci@280
    40
marci@280
    41
class in_edge_iterator;
marci@280
    42
edge iterator 1 pont be eleinek bejarasara, edge_iterator-ra konvertalhato
marci@280
    43
      
marci@280
    44
class sym_edge_iterator;
marci@280
    45
edge iterator 1 pont be es ki eleinek bejarasara, edge_iterator-ra
marci@280
    46
konvertalhato 
marci@280
    47
marci@280
    48
default constructor:
marci@280
    49
marci@280
    50
list_graph();
marci@280
    51
    
marci@280
    52
A graf osztaly fobb publikus metodusai, az alapveto hasznalathoz:
marci@280
    53
Hasonlo funkciok megvalosithatok 1 kesobb leirt modon, illetve 
marci@280
    54
ezek kozul nehany az iteratorok metodusaival, megis azt javasolnam, hogy az 
marci@280
    55
iteratorok metodusait ne hasznaljuk. Miert? Azt  szeretnenk, ha 1 ponthalmazon 
marci@280
    56
van 2 graf, es csak az elhalmazhoz keszitunk uj iteratorokat, akkor pl 1 pont 
marci@280
    57
out-edge-iteratora megkaphato legyen a grafbol es a node_iteratorbol. Ezert 
marci@280
    58
out_edge_iterator(const node_iterator&) hasznalata nem javasolt, 
marci@280
    59
esetleg majd szamuzzuk a concept-bol, s akkor nem nesz baj. 
marci@280
    60
marci@280
    61
each_node_iterator first_node();
marci@280
    62
each_edge_iterator first_edge();
marci@280
    63
out_edge_iterator first_out_edge(const node_iterator&);
marci@280
    64
in_edge_iterator first_in_edge(const node_iterator&);
marci@280
    65
sym_edge_iterator first_sym_edge(const node_iterator&);
marci@280
    66
marci@280
    67
node_iterator tail(const edge_iterator&);
marci@280
    68
node_iterator head(const edge_iterator&);
marci@280
    69
marci@280
    70
node_iterator a_node(const out_edge_iterator&);
marci@280
    71
node_iterator a_node(const in_edge_iterator&);
marci@280
    72
node_iterator a_node(const sym_edge_iterator&);
marci@280
    73
//az out, in or sym edge iterator rogzitett pontjara ad 1 node_iterator-t
marci@280
    74
marci@280
    75
node_iterator b_node(const out_edge_iterator&);
marci@280
    76
node_iterator b_node(const in_edge_iterator&);
marci@280
    77
node_iterator b_node(const sym_edge_iterator&);
marci@280
    78
//az out, in or sym edge iterator nem rogzitett pontjara ad 1 node_iterator-t
marci@280
    79
marci@280
    80
//node_iterator invalid_node();
marci@280
    81
//edge_iterator invalid_edge();
marci@280
    82
//out_edge_iterator invalid_out_edge();
marci@280
    83
//in_edge_iterator invalid_in_edge();
marci@280
    84
//sym_edge_iterator invalid_sym_edge();
marci@280
    85
marci@280
    86
//az iteratorok ures konstruktorai meghatarozatlan 
marci@280
    87
tartalmu konstruktort adnak vissza, ezekkel a matodusokkal 
marci@280
    88
lehet ervenytelent csinalni.
marci@280
    89
Lehet hogy ezt az ures konstruktorral kellene, tessek vitatkozni.
marci@280
    90
marci@280
    91
Kiserleti cellal ugyanezen fv-ek mas stilusu megvalositasai:
marci@280
    92
marci@280
    93
void get_first(each_node_iterator&);
marci@280
    94
void get_first(each_edge_iterator&);
marci@280
    95
void get_first(out_edge_iterator&, const node_iterator&);
marci@280
    96
void get_first(in_edge_iterator&, const node_iterator&);
marci@280
    97
void get_first(sym_edge_iterator&, const node_iterator&);
marci@280
    98
marci@280
    99
void get_tail(node_iterator&, const edge_iterator&);
marci@280
   100
void get_head(node_iterator&, const edge_iterator&);
marci@280
   101
marci@280
   102
void get_a_node(node_iterator&, const out_edge_iterator&);
marci@280
   103
void get_a_node(node_iterator&, const in_edge_iterator&);
marci@280
   104
void get_a_node(node_iterator&, const sym_edge_iterator&);
marci@280
   105
   
marci@280
   106
void get_b_node(node_iterator&, const out_edge_iterator&);
marci@280
   107
void get_b_node(node_iterator&, const in_edge_iterator&);
marci@280
   108
void get_b_node(node_iterator&, const sym_edge_iterator&);
marci@280
   109
 
marci@280
   110
//void get_invalid(node_iterator&);
marci@280
   111
//void get_invalid(edge_iterator&);
marci@280
   112
//void get_invalid(out_edge_iterator&);
marci@280
   113
//void get_invalid(in_edge_iterator&);
marci@280
   114
//void get_invalid(sym_edge_iterator&);
marci@280
   115
 
marci@280
   116
Pontok azonositasara de meginkabb property vectorokhoz:
marci@280
   117
marci@280
   118
int id(const node_iterator&);
marci@280
   119
int id(const edge_iterator&);
marci@280
   120
marci@280
   121
Pontok es elek hozzaadasanak metodusai:
marci@280
   122
marci@280
   123
node_iterator add_node();
marci@280
   124
edge_iterator add_edge(const node_iterator&, const node_iterator&);
marci@280
   125
marci@280
   126
Hogy konnyebb legyen a progikat tesztelni, nehany stream utasitas:
marci@280
   127
ezek nem a list_graph metodusai
marci@280
   128
marci@280
   129
friend std::ostream& operator<<(std::ostream&, const node_iterator&);
marci@280
   130
friend std::ostream& operator<<(std::ostream&, const edge_iterator&);
marci@280
   131
marci@280
   132
node_iterator metodusai:
marci@280
   133
node_iterator();
marci@280
   134
bool valid();
marci@280
   135
void make_invalid();
marci@280
   136
ezek nem tagfuggvenyek:
marci@280
   137
friend bool operator==(const node_iterator&, const node_iterator&);
marci@280
   138
friend bool operator!=(const node_iterator& u, const node_iterator& v);
marci@280
   139
    
marci@280
   140
each_node_iterator metodusai:
marci@280
   141
ez publikusan szarmazik a node_iterator-bol, tehat a fentiek is.
marci@280
   142
each_node_iterator();
marci@280
   143
each_node_iterator& operator++();
marci@280
   144
marci@280
   145
edge_iterator metodusai:
marci@280
   146
edge_iterator();
marci@280
   147
bool valid();
marci@280
   148
void make_invalid();
marci@280
   149
ezek nem tagfvek:
marci@280
   150
friend bool operator==(const edge_iterator&, const edge_iterator&);
marci@280
   151
friend bool operator!=(const edge_iterator&, const edge_iterator&);
marci@280
   152
ujra tagfv-ek.
marci@280
   153
//node_iterator tail_node() const;		nem javasolt
marci@280
   154
//node_iterator head_node() const;		nem javasolt
marci@280
   155
   
marci@280
   156
each_edge_iterator metodusai:
marci@280
   157
edge_iterator-bol szarmazik
marci@280
   158
each_edge_iterator();
marci@280
   159
each_edge_iterator& operator++();
marci@280
   160
 
marci@280
   161
out_edge_iterator metodusai:
marci@280
   162
edge_iterator-bol szarmazik
marci@280
   163
out_edge_iterator();
marci@280
   164
//out_edge_iterator(const node_iterator&);	nem javasolt
marci@280
   165
out_edge_iterator& operator++();
marci@280
   166
//node_iterator a_node() const;		nem javasolt
marci@280
   167
//node_iterator b_node() const; 
marci@280
   168
    
marci@280
   169
 
marci@280
   170
in_edge_iterator metodusai: 
marci@280
   171
edge_iterator-bol szarmazik
marci@280
   172
in_edge_iterator();
marci@280
   173
//in_edge_iterator(const node_iterator&);	nem javasolt
marci@280
   174
in_edge_iterator& operator++();
marci@280
   175
//node_iterator a_node() const;		nem javasolt
marci@280
   176
//node_iterator b_node() const; 
marci@280
   177
marci@280
   178
marci@280
   179
sym_edge_iterator metodusai:
marci@280
   180
edge_iterator-bol szarmazik
marci@280
   181
sym_edge_iterator();
marci@280
   182
//sym_edge_iterator(const node_iterator&);	nem javasolt
marci@280
   183
sym_edge_iterator& operator++();
marci@280
   184
//node_iterator a_node() const;		nem javasolt
marci@280
   185
//node_iterator b_node() const; 
marci@280
   186
		
marci@280
   187
Node propery array-okrol:
marci@280
   188
marci@280
   189
template <typename graph_type, typename T>
marci@280
   190
class node_property_vector; 
marci@280
   191
marci@280
   192
metodusok:
marci@280
   193
marci@280
   194
node_property_vector(graph_type&);
marci@280
   195
void put(graph_type::node_iterator, const T&);
marci@280
   196
T get(graph_type::node_iterator);
marci@280
   197
marci@280
   198
Ugyanez edge_property_array-okkal
marci@280
   199
marci@280
   200
template <typename graph_type, typename T>
marci@280
   201
class edge_property_vector;
marci@280
   202
marci@280
   203
edge_property_vector(graph_type&);
marci@280
   204
void put(graph_type::edge_iterator, const T&);
marci@280
   205
get(graph_type::edge_iterator);
marci@280
   206
marci@280
   207
 Ennyi nem javasolas utan, meg nehany szo.
marci@280
   208
 Alparral ugy gondoltuk, hogy az iterator 1 olyan egyszeru objetum legyen 
marci@280
   209
csak, mellyel, ha ervenyes, akkor lehet tovabblepni 1 pont vagy ellistaban. 
marci@280
   210
Az hogy valamilyen pont-iteratorbeol el-iteratort csinalunk, igenis legyen a 
marci@280
   211
graf objektum feladata, hiszen igy lehet csinelni ugyanazon a ponthalmazon
marci@280
   212
tobb grafot ugyanazon pont-iteratorokkal.
marci@280
   213
 Sokkal komolyabb kerdesek merultek fel azzal kapcsolatban, hogy hogyan adjuk 
marci@280
   214
at a propertyket az algoritmusoknak, algoritmus-objektumoknak. 
marci@280
   215
Errol majd kesobb.
marci@280
   216
marci@280
   217
marci@cs.elte.hu