Changeset e7de6cc for src/dgp/sgraph.cc


Ignore:
Timestamp:
02/21/12 20:02:51 (13 years ago)
Author:
Tomasz Obrebski <to@…>
Branches:
master
Children:
b242df2
Parents:
354ba3d
git-author:
Tomasz Obrebski <to@…> (02/21/12 20:02:51)
git-committer:
Tomasz Obrebski <to@…> (02/21/12 20:02:51)
Message:

new version of dgp
added dgc, tre and compdic components
compiledic renamed to compdic_utf8
./configure updated

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/dgp/sgraph.cc

    r5f4d9c3 re7de6cc  
    11#include "global.hh" 
    22#include "sgraph.hh" 
    3 #include "mgraph.hh" 
    43#include "grammar.hh" 
    54#include "const.hh" 
    6 #include <stdio.h> 
     5#include <cstdio> 
     6#include <sstream> 
    77 
     8extern MGraph mgraph; 
    89 
    9 int SGraph::add_base_snode(MNode* mn) 
     10//==================================================================================================== 
     11 
     12int SGraph::add_base_snode(int mnodeind) 
    1013{ 
    11   int nodeind=n; 
    12   SNode &node=nodes[n]; 
     14  SNode& newnode =  makenewnode();  
    1315 
    14   node.clear(); 
     16  newnode.mnode=mnodeind; 
    1517 
    16   node.mnode=mn; 
    17  
    18   for(vector<MNode*>::iterator pm=node.mnode->pred.begin(); pm!=node.mnode->pred.end(); ++pm) 
    19     for(vector<int>::iterator ps=(*pm)->snodes.begin(); ps!=(*pm)->snodes.end(); ++ps) 
     18  for(vector<int>::iterator pm=mgraph[newnode.mnode].pred.begin(); pm!=mgraph[newnode.mnode].pred.end(); ++pm) 
     19    for(vector<int>::iterator ps=mgraph[*pm].snodes.begin(); ps!=mgraph[*pm].snodes.end(); ++ps) 
    2020      if(nodes[*ps].in_LH) 
    2121      { 
    22         node.LV.set(*ps); 
    23         if(nodes[*ps].saturated()) node.LV |= nodes[*ps].LH; 
     22        newnode.LV.set(*ps); 
     23        if(nodes[*ps].saturated()) newnode.LV |= nodes[*ps].LH; 
    2424      } 
    2525 
    26   mn->snodes.push_back(nodeind); 
    27   ++n; 
     26  mgraph[newnode.mnode].snodes.push_back(lastnodeind()); 
    2827 
    29   node.in_LH=true; 
     28  newnode.in_LH=true; 
    3029 
    31   return nodeind; 
     30  return lastnodeind(); 
    3231} 
    3332 
     33//==================================================================================================== 
    3434 
    3535void SGraph::update_left(int headind, int depind) 
     
    3737  SNode &head=nodes[headind], &dep=nodes[depind]; 
    3838 
    39   if(dep.saturated()) head.LV |= dep.LV, head.LD |= dep.LD; 
     39  if(dep.saturated())  head.LV |= dep.LV, head.LD |= dep.LD; 
    4040} 
    4141 
     
    4646 
    4747  dep.LH.set(headind); 
    48   if(head.saturated()) 
    49     dep.LH |= head.LH; 
    50 } 
     48  if(head.saturated())  dep.LH |= head.LH; 
     49}  
    5150 
     51//==================================================================================================== 
    5252 
    5353int SGraph::clone(int ancind, NodeProp newprop) 
    5454{ 
    55   int newind = n++; 
    56   SNode &newnode=nodes[newind]; 
     55  SNode &newnode=makenewnode(); 
    5756  SNode &ancnode = nodes[ancind]; 
    5857 
    59   newnode.clear(); 
     58 
     59 
    6060  newnode.prop=newprop; 
    6161  newnode.mnode=ancnode.mnode; 
    62   newnode.mnode->snodes.push_back(newind); 
    63   return newind; 
     62  mgraph[newnode.mnode].snodes.push_back(lastnodeind()); 
     63 
     64  return lastnodeind(); 
    6465} 
    6566 
    66  
    67 //------------------------------------------------------------------------- 
    68 //------------------------------------------------------------------------- 
    69  
     67//==================================================================================================== 
    7068 
    7169int SGraph::print_node(FILE* f, int n, unsigned int info) 
    7270{ 
    73   char buf[1000]; 
    74   sprint_node(buf,n,info); 
     71  char buf[50000]; 
     72  sprint_node(buf,n,-1,info); 
    7573  fputs(buf,f); 
    7674} 
    7775 
    78 int SGraph::sprint_node(char* buf, int nodeind, unsigned int info) 
     76//---------------------------------------------------------------------------------------------------- 
     77 
     78int SGraph::print_node_debug(FILE* f, const char* pref, int n, int anc) 
     79{ 
     80  char buf[50000]; 
     81  sprint_node_debug(buf,pref,n,anc); 
     82  fputs(buf,f); 
     83} 
     84 
     85//---------------------------------------------------------------------------------------------------- 
     86 
     87void SGraph::print_arc(FILE* f, int head, int dep, Role role, int dir) // 0 - left, 1 - right 
     88{ 
     89  if(dir==0) 
     90    fprintf(f,"#A  %s:%d <-- %d\n", role.str(), dep, head); 
     91  else 
     92    fprintf(f,"#A  %s:%d --> %d\n", role.str(), head, dep); 
     93} 
     94 
     95//==================================================================================================== 
     96 
     97int SGraph::sprint_node(char* buf, int nodeind, int anc, unsigned int info) 
    7998{ 
    8099  char* buf0=buf; 
    81   char descr[256]; 
    82   char nodeinfo[16]; 
    83100 
    84101  SNode &node=nodes[nodeind]; 
    85102 
    86103  buf+=sprintf(buf," dgp:%d",nodeind); 
     104  if(anc>=0) buf+=sprintf(buf,"(%d)",anc); 
    87105  buf+=sprintf(buf, saturated(nodeind) ? ";s" : ";u"); 
    88106 
     107  if (info&HEADS || info&DEPS) 
     108    buf+=sprintf(buf,";"); 
     109 
    89110  bool cont=false; 
     111 
    90112  if (info&HEADS) 
    91   { 
    92     buf+=sprintf(buf,";"); 
    93113    for(vector<Arc>::iterator h=node.heads.begin(); h!=node.heads.end(); ++h) 
    94114    { 
    95115      if(cont) buf+=sprintf(buf,","); else cont=true; 
    96       buf+=sprintf(buf,"++%s-%d/%d",h->role.str(),h->dst,h->anc); 
     116      buf+=sprintf(buf,"++%s-%d(%d~%d)",h->role.str(),h->dst,h->headanc,h->depanc); 
    97117    } 
    98   } 
    99    
     118 
    100119  if (info&DEPS) 
    101   { 
    102     buf+=sprintf(buf,";"); 
    103120    for(vector<Arc>::iterator d=node.deps.begin(); d!=node.deps.end(); ++d) 
    104121    { 
    105122      //      if(! nodes[d->dst].saturated()) continue; // NIE DRUKUJ NIENASYCONYCH PODRZEDNIKOW 
    106123      if(cont) buf+=sprintf(buf,","); else cont=true; 
    107       buf+=sprintf(buf,"--%s-%d/%d",d->role.str(),d->dst,d->anc); 
     124      buf+=sprintf(buf,"--%s-%d(%d~%d)",d->role.str(),d->dst,d->headanc,d->depanc); 
    108125    } 
    109   } 
    110126   
    111127  if (info&SETS) 
     
    113129    int ord=0; 
    114130    buf+=sprintf(buf,";{"); 
    115     for(vector<MNode*>::iterator pm=node.mnode->pred.begin(); pm!=node.mnode->pred.end(); ++pm) 
    116       for(vector<int>::iterator ps=(*pm)->snodes.begin(); ps!=(*pm)->snodes.end(); ++ps) 
     131    for(vector<int>::iterator pm=mgraph[node.mnode].pred.begin(); pm!=mgraph[node.mnode].pred.end(); ++pm) 
     132      for(vector<int>::iterator ps=mgraph[*pm].snodes.begin(); ps!=mgraph[*pm].snodes.end(); ++ps) 
    117133        buf+=sprintf(buf, ord++ ? ",%d" : "%d", *ps); 
    118134    buf+=sprintf(buf,"};{"); 
    119     ord=0;for(int j=0; j<=n; ++j) if(node.LV[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j); 
     135    ord=0;for(int j=0; j<size(); ++j) if(node.LV[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j); 
    120136    buf+=sprintf(buf,"};{"); 
    121     ord=0;for(int j=0; j<=n; ++j) if(node.LH[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j); 
     137    ord=0;for(int j=0; j<size(); ++j) if(node.LH[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j); 
    122138    buf+=sprintf(buf,"};{"); 
    123     ord=0;for(int j=0; j<=n; ++j) if(node.LD[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j); 
     139    ord=0;for(int j=0; j<size(); ++j) if(node.LD[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j); 
    124140    buf+=sprintf(buf,"}"); 
    125141  } 
     
    133149    for(Role i=1; i<=Role::count(); ++i) 
    134150      if(node.prop.required[i]) buf+=sprintf(buf,"%s&%s",(cont++)?",":"",i.str()); 
     151    for(Role i=1; i<=Role::count(); ++i) 
     152      if(node.prop.attached[i]) buf+=sprintf(buf,"%s+%s",(cont++)?",":"",i.str()); 
     153    for(Flag i=1; i<=Flag::count(); ++i) 
     154      if(node.prop.flags [i]) buf+=sprintf(buf,"%s<%s>",(cont++)?",":"",i.str()); 
     155    if(node.prop.init_attached) 
     156      buf+=sprintf(buf,"<init>"); 
     157    if(node.prop.fin_attached) 
     158      buf+=sprintf(buf,"<fin>"); 
     159 
     160    stringstream oss; 
     161    for(list<Boubble*>::iterator b = node.prop.boubbles.begin(); b != node.prop.boubbles.end(); b++) 
     162      oss << (cont++ ? "," : "") << **b; 
     163    buf+=sprintf(buf,oss.str().c_str()); 
    135164  } 
    136165   
     
    141170 
    142171 
    143 int SGraph::sprint_node_debug(char* buf, const char* pref, int n) 
     172int SGraph::sprint_node_debug(char* buf, const char* pref, int n, int anc) 
    144173{ 
    145174  char *buf0 = buf; 
    146175  buf+=sprintf(buf,"#%s",pref); 
    147   buf+=sprint_node(buf,n,HEADS|DEPS|SETS|CONSTRAINTS); 
     176 
     177  buf+=sprintf(buf,"%-16s",form(n)); 
     178 
     179  buf+=sprint_node(buf,n,anc,HEADS|DEPS|SETS|CONSTRAINTS); 
    148180  buf+=sprintf(buf,"\n"); 
    149181  return buf-buf0; 
    150182} 
    151183 
    152 int SGraph::print_node_debug(FILE* f, const char* pref, int n) 
    153 { 
    154   char buf[1000]; 
    155   sprint_node_debug(buf,pref,n); 
    156   fputs(buf,f); 
    157 } 
    158  
    159 void SGraph::print_arc(FILE* f, int left, int right, Role role, int dir) // 0 - left, 1 - right 
    160 { 
    161   fprintf(f,"#   %s:%s.%02d %s %s.%02d\n", 
    162           role.str(),nodes[left].mnode->type,left, 
    163           dir ? "-->" : "<--", 
    164           nodes[right].mnode->type,right); 
    165 } 
Note: See TracChangeset for help on using the changeset viewer.