Index: src/dgp/dgp1.cc
===================================================================
--- src/dgp/dgp1.cc	(revision d484a3254b584fb1c97577bdc58ee2ae3796028c)
+++ src/dgp/dgp1.cc	(revision acbabee74272f626d34fbc8e42126d06c76c7903)
@@ -2,5 +2,5 @@
 using namespace std;
 
-#include "dgp0.hh"
+#include "dgp1.hh"
 #include "global.hh"
 
@@ -71,25 +71,13 @@
 //====================================================================================================
 
-int find_existing_node(int mnodeind, NodeProp p, bitset<MAXNODES>& newheadLH, bitset<MAXNODES>& newheadLV)
-{
-  MNode& mnode = mgraph[mnodeind];
-  int ret=-1;
-  for(vector<int>::iterator ps=mnode.snodes.begin(); ps!=mnode.snodes.end(); ++ps)
-    {
-      if(debug) fprintf(stderr,"#find existing node: checking %d ... \n", *ps);
-      if(sgraph[*ps].prop==p)
-	if(sgraph[*ps].LH==newheadLH && sgraph[*ps].LV==newheadLV)
-	  {
-	    ret = *ps;
-	    if(debug) fprintf(stderr,"#\tsucceeded because of LH/LV equality ()\n");
-	  }
-	else
-	  {
-	    if(debug) fprintf(stderr,"#\tfailed beacause of LH/LV inequality\n");
-	  }
-    }
-
-  if(debug) fprintf(stderr,"\n");
-  return ret;
+int find_existing_node(int mnode, NodeProp p, Edge e)
+{
+  for(vector<int>::iterator i = mgraph[mnode].snodes.begin(); i!=mgraph[mnode].snodes.end(); ++i)
+    if(sgraph[*i].prop==p && sgraph[*i].edge==e)
+      { 
+	if(debug) fprintf(stderr,"\t\treusing %d\n",*i);
+	return *i;
+      }
+  return -1;
 }
 
@@ -161,75 +149,15 @@
 //====================================================================================================
 
-int create_new_head_node_left(int anc, NodeProp& prop, bitset<MAXNODES>& LH, bitset<MAXNODES>& LD, bitset<MAXNODES>& LV)
-{
-  int newheadind = sgraph.clone(anc,prop);
+int create_new_node(int anc, NodeProp& prop, Edge edge)
+{
+  int newheadind = sgraph.clone(anc,prop,edge);
   nodelist.push_back(newheadind);
-  sgraph[newheadind].LH = LH;
-  sgraph[newheadind].LD = LD;
-  sgraph[newheadind].in_LH = true;
-  sgraph[newheadind].LV.reset();
-
   copy_links(anc,newheadind);
   create_reverse_links(newheadind);
-  
-  if(debug) sgraph.print_node_debug(stderr,"add new",newheadind,anc);
+  if(debug) sgraph.print_node_debug(stderr,"clone",newheadind,anc);
   // if(debug) print_sets(newheadind);
   return newheadind;
 }
 
-int create_new_dep_node_left(int anc, NodeProp& prop, bitset<MAXNODES>& LH, bitset<MAXNODES>& LD, bitset<MAXNODES>& LV)
-{
-  int newind = sgraph.clone(anc,prop);
-  nodelist.push_back(newind);
-  sgraph[newind].LH.reset();
-  sgraph[newind].LD=LD;
-  sgraph[newind].in_LH=false; //???????
-  sgraph[newind].LV.reset();
-
-  copy_links(anc,newind);
-  create_reverse_links(newind);
-  
-  if(debug) sgraph.print_node_debug(stderr,"add new",newind,anc);
-  // if(debug) print_sets(newind);
-  
-  return newind;
-}
-
-int create_new_head_node_right(int anc, NodeProp& prop, bitset<MAXNODES>& newheadLH, bitset<MAXNODES>& newheadLD, bitset<MAXNODES>& newheadLV)
-{
-  int newheadind = sgraph.clone(anc,prop);
-  nodelist.push_back(newheadind);
-  sgraph[newheadind].LH=newheadLH;
-  sgraph[newheadind].LD=newheadLD;
-  sgraph[newheadind].in_LH=false;
-  sgraph[newheadind].LV=newheadLV;
-  
-  copy_links(anc,newheadind);
-  create_reverse_links(newheadind);
-
-  if(debug) sgraph.print_node_debug(stderr,"add new",newheadind,anc);
-  // if(debug) print_sets(newheadind);
-  
-  return newheadind;
-}
-
-int create_new_dep_node_right(int anc, NodeProp& prop, bitset<MAXNODES>& LH, bitset<MAXNODES>& LD, bitset<MAXNODES>& LV)
-{
-  int newind = sgraph.clone(anc,prop);
-  nodelist.push_back(newind);
-  sgraph[newind].LH=LH;
-  sgraph[newind].LD=LD;
-  sgraph[newind].in_LH=true; //???????
-  sgraph[newind].LV.reset();
-  
-  copy_links(anc,newind);
-  create_reverse_links(newind);
-
-  if(debug) sgraph.print_node_debug(stderr,"ADD NEW",newind,anc);
-  // if(debug) print_sets(newind);
-  
-  return newind;
-}
-
 //====================================================================================================
 
@@ -237,183 +165,64 @@
 {
 
-  NodeProp &oldheadprop = sgraph[h].prop;
-  NodeProp &olddepprop = sgraph[d].prop;
-
-  NodeProp newheadprop  = compute_head_prop(oldheadprop,l,new_head_boubbles,olddepprop.flags);
-  
-  int newheadind;
-  if(oldheadprop==newheadprop)
-    newheadind = h;
-  else
-  {
-    bitset<MAXNODES> newheadLH = sgraph[h].LH;
-    bitset<MAXNODES> newheadLV = sgraph[d].LV;
-    bitset<MAXNODES> newheadLD = sgraph[h].LD;
-
-    newheadind = find_existing_node(sgraph[h].mnode, newheadprop, newheadLH, newheadLV);
-    if( newheadind >= 0) // W£¡CZONE
-      sgraph[newheadind].LD |= newheadLD;
-    else
+  NodeProp &old_head_prop = sgraph[h].prop;
+  NodeProp &old_dep_prop = sgraph[d].prop;
+  NodeProp new_head_prop  = compute_head_prop(old_head_prop,l,new_head_boubbles,old_dep_prop.flags);
+  NodeProp new_dep_prop = compute_dep_prop(old_dep_prop,l,new_dep_boubbles);
+  
+  Edge new_dep_edge(sgraph[d].edge);
+  int newd = find_existing_node(sgraph[d].mnode, new_dep_prop, new_dep_edge);
+  if( newd < 0  )
+    newd = create_new_node(d,new_dep_prop,new_dep_edge);
+  
+  Edge new_head_edge(sgraph[newd].edge,newd);
+  int newh = find_existing_node(sgraph[h].mnode, new_head_prop, new_head_edge);
+  if( newh < 0 )
+    newh = create_new_node(h,new_head_prop,new_head_edge);
+    
+  sgraph[newh].deps.push_back(Arc(newd,l.role,h,d));
+  sgraph[newd].heads.push_back(Arc(newh,l.role,h,d));
+
+  if(debug)
+    {
+      sgraph.print_arc(stderr,"link",newh,d,l.role,0);
+      sgraph.print_node_debug(stderr,"",newh,h);
+      sgraph.print_node_debug(stderr,"",newd,d);
+    }
+}
+
+//----------------------------------------------------------------------------------------------------
+
+void connect_right(int h, int d, const Link& l, list<Boubble*>& new_head_boubbles, list<Boubble*>& new_dep_boubbles)
+{
+  NodeProp &old_head_prop = sgraph[h].prop;
+  NodeProp &old_dep_prop = sgraph[d].prop;
+  NodeProp new_head_prop = compute_head_prop(old_head_prop,l,new_head_boubbles,old_dep_prop.flags);
+  NodeProp new_dep_prop = compute_dep_prop(old_dep_prop,l,new_dep_boubbles);
+
+  Edge new_head_edge(sgraph[h].edge);
+  int newh = find_existing_node(sgraph[h].mnode, new_head_prop, new_head_edge);
+  if( newh < 0 )
       {
-	newheadind = create_new_head_node_left(h,newheadprop,newheadLH,newheadLD,newheadLV);
-	sgraph[newheadind].edge.clear();
-	sgraph[newheadind].edge_contains_self = false;
+	newh = create_new_node(h,new_head_prop,new_head_edge);
+	sgraph[newh].visible_as_neighbour = false;
       }
-    
-  }
-
-  NodeProp newdepprop = compute_dep_prop(olddepprop,l,new_dep_boubbles);
-
-  int newdepind;
-  
-  if(olddepprop==newdepprop)
-    newdepind = d;
-  else
-  {
-    bitset<MAXNODES> newdepLH = sgraph[d].LH;
-    bitset<MAXNODES> newdepLV = sgraph[d].LV;
-    bitset<MAXNODES> newdepLD = sgraph[d].LD;
-
-    newdepind = find_existing_node(sgraph[d].mnode, newdepprop, newdepLH, newdepLV);
-    if( newdepind >= 0) // W£¡CZONE
-      sgraph[newdepind].LD |= newdepLD; // TYLKO DLA LD
-    else
-      {
-	newdepind = create_new_dep_node_left(d,newdepprop,newdepLH,newdepLD,newdepLV);
-	sgraph[newdepind].edge.clear();
-	//sgraph[newdepind].edge.push_back(newdepind); // TO
-	sgraph[newdepind].edge_contains_self = true; // LUB TO
-      }
-  }
-  
-
-  sgraph[newheadind].deps.push_back(Arc(newdepind,l.role,h,d));
-  sgraph[newdepind].heads.push_back(Arc(newheadind,l.role,h,d));
-  sgraph[newheadind].edge.push_back(newdepind);
-  
-  if(sgraph[d].saturated()) sgraph[newheadind].LV |= sgraph[d].LV;
-
-  sgraph[newheadind].LD.set(d);
-  if(sgraph[d].saturated()) sgraph[newheadind].LD |= sgraph[d].LD;
-  
-  if(debug) sgraph.print_arc(stderr,"new link",newheadind,d,l.role,0);
-  if(debug) sgraph.print_node_debug(stderr,"update",newheadind,h);
-  // if(debug) print_sets(newheadind);
-  if(debug) sgraph.print_node_debug(stderr,"update",newdepind,d);
-  // if(debug) print_sets(newdepind);
-}
-
-//----------------------------------------------------------------------------------------------------
-
-void connect_right(int h, int d, const Link& l, list<Boubble*>& new_head_boubbles, list<Boubble*>& new_dep_boubbles)
-{
-  NodeProp &oldheadprop = sgraph[h].prop;
-
-  NodeProp newheadprop = compute_head_prop(oldheadprop,l,new_head_boubbles, sgraph[d].prop.flags);
-
-  int newheadind;
-  
-  if(oldheadprop==newheadprop)
-    newheadind = h;
-  else
-  {
-    bitset<MAXNODES> newheadLH = sgraph[h].LH;
-    bitset<MAXNODES> newheadLV = sgraph[h].LV;
-    bitset<MAXNODES> newheadLD = sgraph[h].LD;
-
-    newheadind = find_existing_node(sgraph[h].mnode, newheadprop, newheadLH, newheadLV);
-
-    if(debug) fprintf(stderr,"#HEAD EXISTS %d\n",newheadind);
-
-    if( newheadind >= 0) // W£¡CZONE
-      sgraph[newheadind].LD |= newheadLD; // TYLKO DLA LD
-    else
-      {
-	newheadind = create_new_head_node_right(h,newheadprop,newheadLH,newheadLD,newheadLV);
-	//if(!sgraph[h].edge.empty()) sgraph[newheadind].edge.push_back(newheadind); // TO
-	sgraph[newheadind].edge_contains_self = sgraph[h].edge_contains_self;      // LUB TO
-	sgraph[newheadind].visible_as_neighbour = false;
-      }
-  }
-
-  NodeProp &olddepprop = sgraph[d].prop;
-  NodeProp newdepprop = compute_dep_prop(olddepprop,l,new_dep_boubbles);
-
-  int newdepind;
-  
-  if(olddepprop==newdepprop)
-    newdepind = d;
-  else
-  {
-    bitset<MAXNODES> newdepLH = sgraph[d].LH;
-    bitset<MAXNODES> newdepLV = sgraph[d].LV;
-    bitset<MAXNODES> newdepLD = sgraph[d].LD;
-
-    newdepind = find_existing_node(sgraph[d].mnode, newdepprop, newdepLH, newdepLV);
-
-    if(debug) fprintf(stderr,"#DEP EXISTS %d\n",newdepind);
-
-    if( newdepind >= 0) // W£¡CZONE
-      sgraph[newdepind].LD |= newdepLD; // TYLKO DLA LD
-    else
-      {
-	newdepind = create_new_dep_node_right(d,newdepprop,newdepLH,newdepLD,newdepLV);
-	sgraph[newdepind].edge.clear();
-	sgraph[newdepind].edge_contains_self = false;
-      }
-  }
-
-
-  sgraph[newdepind].heads.push_back(Arc(newheadind,l.role,h,d));
-  sgraph[newheadind].deps.push_back(Arc(newdepind,l.role,h,d));
-  //sgraph[newdepind].edge.push_back(newheadind);
-
-  sgraph[newdepind].LH.set(newheadind);
-
-  //  sgraph[*d].prop.merge_boubbles(new_dep_boubbles);
-  
-  if(sgraph[newheadind].saturated()) sgraph[newdepind].LH |= sgraph[newheadind].LH;
-
-  if(debug) sgraph.print_arc(stderr,"new link",newheadind,newdepind,l.role,1);
-  if(debug) sgraph.print_node_debug(stderr,"update",newheadind,h);
-  if(debug) sgraph.print_node_debug(stderr,"update",newdepind,d);
-  
-}
-
-//====================================================================================================
-
-// bool check_meeting_boubles(list<Boubble*>& hboubbles, list<Boubble*>& dboubbles)
-// {
-//   bool hremove=false;             // czy usun±æ ostatnio sprawdzany b±bel
-//   bool dremove=false;             // czy usun±æ ostatnio sprawdzany b±bel
-
-//   for(list<Boubble*>::iterator hb = hboubbles.begin(); hb != hboubbles.end(); hb = hremove ? hboubbles.erase(hb) : ++hb )
-//     {
-//       hremove=false;
-//       for(list<Boubble*>::iterator db = dboubbles.begin(); db != dboubbles.end(); db = dremove ? dboubbles.erase(db) : ++db )
-// 	{
-// 	  dremove=false;
-// 	  if( (*hb)->rel()==(*db)->rel() && (*hb)->dir()==DOWN && (*db)->dir()==UP && (*hb)->reverse()!=(*db)->reverse() )
-// 	    {
-// 	      int srcnode,dstnode;
-// 	      if( (*hb)->reverse()==false )
-// 		srcnode = (*hb)->src(), dstnode = (*db)->src();
-// 	      else
-// 		srcnode = (*db)->src(), dstnode = (*hb)->src();
-// 	      if( grammar.check_longrel(sgraph.cat(srcnode), sgraph.cat(dstnode), (*hb)->rel()) )
-// 		{
-// 		  hremove=dremove=true;
-// 		  if(debug) fprintf(stderr,"BOUBBLES MET!!!\n");
-// 		}
-// 	      else
-// 		{
-// 		  if(debug) fprintf(stderr,"BOUBBLES' MEETING FAILED!!!\n");
-// 		  return false;
-// 		}
-// 	    }
-// 	}
-//     }
-//   return true;
-// }
+
+  Edge new_dep_edge;
+  int newd = find_existing_node(sgraph[d].mnode, new_dep_prop, new_dep_edge);
+  if( newd < 0)
+    newd = create_new_node(d,new_dep_prop,new_dep_edge);
+
+
+  sgraph[newd].heads.push_back(Arc(newh,l.role,h,d));
+  sgraph[newh].deps.push_back(Arc(newd,l.role,h,d));
+
+  if(debug)
+    {
+      sgraph.print_arc(stderr,"link",newh,newd,l.role,1);
+      sgraph.print_node_debug(stderr,"",newh,h);
+      sgraph.print_node_debug(stderr,"",newd,d);
+    }
+  
+}
 
 //====================================================================================================
@@ -424,15 +233,16 @@
   bool dremove=false;             // czy usun±æ ostatnio sprawdzany b±bel
 
+  // cerr << "CHECKING MEETING BUBBLES" << endl;
+
   for(list<Boubble*>::iterator hb = boubbles.begin(); hb != boubbles.end(); hb = hremove ? boubbles.erase(hb) : ++hb )
     {
-      cout << endl << "hb:" << **hb ;
       hremove=false;
       for(list<Boubble*>::iterator db = hb; db != boubbles.end(); db = dremove ? boubbles.erase(db) : ++db )
 	{
-	  cout << " db:" << **db;
+	  // cerr << " db:" << **db;
 	  dremove=false;
 	  if( (*hb)->rel()==(*db)->rel() && (*hb)->reverse()!=(*db)->reverse() )
 	    {
-	      cout << "Z";
+	      // cerr << "Z"; 
 	      int srcnode,dstnode;
 	      if( (*hb)->reverse()==false )
@@ -442,5 +252,5 @@
 	      if( grammar.check_longrel(sgraph.cat(srcnode), sgraph.cat(dstnode), (*hb)->rel()) )
 		{
-		  cout << " REMOVE ";
+		  // cerr << " REMOVE ";
 		  hremove=dremove=true;
 		  if(debug) fprintf(stderr,"BOUBBLES MET!!!\n");
@@ -448,5 +258,5 @@
 	      else
 		{
-		  cout << " FAIL ";
+		  // cerr << " FAIL ";
 		  if(debug) fprintf(stderr,"BOUBBLES' MEETING FAILED!!!\n");
 		  return false;
@@ -471,5 +281,5 @@
       if( grammar.check_longrel(sgraph.cat((*b)->src()), sgraph.cat(node), (*b)->rel()) )
 	{
-	  cout << endl << "REMOVE ChBatT " << **b << endl;
+	  // cerr << endl << "REMOVE ChBatT " << **b << endl;
 	  remove=true;
 	}
@@ -489,10 +299,7 @@
   int i;
   while((i=lvi.next()) >= 0)
-    {
-      //if(debug) sgraph.print_node_debug(stderr,"D-CUR>",i,-1);
-
       if(sgraph.saturated(i))
 	{
-	  if(debug) {fprintf(stderr,"%d <--",i); }
+	  if(debug) {fprintf(stderr,"\t%d <-- %d",i,j); }
 	  
 	  list<const Link*> ji_links = grammar.connectable2( sgraph.cat(j), sgraph.cat(i), sgraph[j].prop.flags, sgraph[i].prop.flags); // ref do Roles!!!
@@ -517,5 +324,5 @@
 			  if(debug) fprintf(stderr," ...SUCCESS!\n");
 			  connect_left( j, i, **ri, new_head_boubbles, new_dep_boubbles);
-			  lvi.update_edge(sgraph,i);
+			  // lvi.update_edge(sgraph,i);
 			}
 		      else
@@ -526,7 +333,5 @@
 	}
       else
-	  if(debug) {fprintf(stderr,"%d <--     unsaturated\n",i); }
-    }
-  
+	if(debug) {fprintf(stderr,"\t%d <-- %d\t%d unsaturated\n",i,j,i); }  
 }
 //----------------------------------------------------------------------------------------------------
@@ -537,42 +342,39 @@
   int i;
   while((i=lvi.next()) >= 0)
-    {
-      // if(debug) sgraph.print_node_debug(stderr,"H-CUR> ",i,-1);
-      if(sgraph.saturated(j))
-	{
-	  if(debug) fprintf(stderr, "%d -->",i);
-	  
-	  list<const Link*> ij_links = grammar.connectable2( sgraph.cat(i), sgraph.cat(j), sgraph[i].prop.flags, sgraph[j].prop.flags );
-	  list<const Link*>::iterator ri = ij_links.begin();
-	  if(ri == ij_links.end()) { if(debug) fprintf(stderr,"     no roles\n"); }
-	  else
-	    {
-	      for(; ri != ij_links.end(); ++ri )
-		{
-		  if(debug) fprintf(stderr,"     %s",(*ri)->role.str());
-		  if( !grammar.check_constr2( sgraph[i].prop, sgraph[j].prop, 1, **ri ) )
-		    { if(debug) fprintf(stderr," ...constraints failed\n"); }
-		  else
-		    {
-		      list<Boubble*> new_head_boubbles = collect_head_boubbles(i,j,(*ri)->role);
-		      list<Boubble*> new_dep_boubbles = collect_dep_boubbles(i,j,(*ri)->role);
-		      
-		      if( check_meeting_boubles(new_head_boubbles) &&
-			  check_meeting_boubles(new_dep_boubbles) &&
-			  check_boubbles_at_target(new_head_boubbles,i) &&
-			  check_boubbles_at_target(new_dep_boubbles,j) )
-			{
-			  if(debug) fprintf(stderr," ...SUCCESS!\n");
-			  connect_right( i, j, **ri, new_head_boubbles, new_dep_boubbles );
-			}
-		      else
-			{ if(debug) fprintf(stderr," ...bubbles failed\n",i); }
-		    }
-		}
-	    }
-	}
-      else
-	  if(debug) {fprintf(stderr,"%d <--     unsaturated\n",j); }
-    }
+    if(sgraph.saturated(j))
+      {
+	if(debug) fprintf(stderr, "\t%d --> %d",i,j);
+	
+	list<const Link*> ij_links = grammar.connectable2( sgraph.cat(i), sgraph.cat(j), sgraph[i].prop.flags, sgraph[j].prop.flags );
+	list<const Link*>::iterator ri = ij_links.begin();
+	if(ri == ij_links.end()) { if(debug) fprintf(stderr,"     no roles\n"); }
+	else
+	  {
+	    for(; ri != ij_links.end(); ++ri )
+	      {
+		if(debug) fprintf(stderr,"     %s",(*ri)->role.str());
+		if( !grammar.check_constr2( sgraph[i].prop, sgraph[j].prop, 1, **ri ) )
+		  { if(debug) fprintf(stderr," ...constraints failed\n"); }
+		else
+		  {
+		    list<Boubble*> new_head_boubbles = collect_head_boubbles(i,j,(*ri)->role);
+		    list<Boubble*> new_dep_boubbles = collect_dep_boubbles(i,j,(*ri)->role);
+		    
+		    if( check_meeting_boubles(new_head_boubbles) &&
+			check_meeting_boubles(new_dep_boubbles) &&
+			check_boubbles_at_target(new_head_boubbles,i) &&
+			check_boubbles_at_target(new_dep_boubbles,j) )
+		      {
+			if(debug) fprintf(stderr," ...SUCCESS!\n");
+			connect_right( i, j, **ri, new_head_boubbles, new_dep_boubbles );
+		      }
+		    else
+		      { if(debug) fprintf(stderr," ...bubbles failed\n",i); }
+		  }
+	      }
+	  }
+      }
+    else
+      if(debug) {fprintf(stderr,"\t* <-- %d    unsaturated\n",j); }
 }
 
@@ -662,5 +464,5 @@
     nodelist.push_back(basenode);
 
-    if(debug) sgraph.print_node_debug(stderr,"add base",basenode,-1); // STDOUT!!!
+    if(debug) sgraph.print_node_debug(stderr,"node",basenode,-1); // STDOUT!!!
     // if(debug) print_sets(basenode);
 
@@ -668,5 +470,5 @@
     while(++cursor != nodelist.end())
     {
-      if(debug) sgraph.print_node_debug(stderr,"MAIN-CUR> ",*cursor,-1);
+      if(debug) sgraph.print_node_debug(stderr,"CUR>",*cursor,-1);
       try_connect_dependents(*cursor);
       try_connect_heads(*cursor);
