source: src/dgp/sgraph.cc @ 5f4d9c3

Last change on this file since 5f4d9c3 was 5f4d9c3, checked in by Maciej Prill <mprill@…>, 12 years ago

Rewritten the build system, added lem UTF-8 version.

  • Property mode set to 100644
File size: 4.1 KB
Line 
1#include "global.hh"
2#include "sgraph.hh"
3#include "mgraph.hh"
4#include "grammar.hh"
5#include "const.hh"
6#include <stdio.h>
7
8
9int SGraph::add_base_snode(MNode* mn)
10{
11  int nodeind=n;
12  SNode &node=nodes[n];
13
14  node.clear();
15
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)
20      if(nodes[*ps].in_LH)
21      {
22        node.LV.set(*ps);
23        if(nodes[*ps].saturated()) node.LV |= nodes[*ps].LH;
24      }
25
26  mn->snodes.push_back(nodeind);
27  ++n;
28
29  node.in_LH=true;
30
31  return nodeind;
32}
33
34
35void SGraph::update_left(int headind, int depind)
36{
37  SNode &head=nodes[headind], &dep=nodes[depind];
38
39  if(dep.saturated()) head.LV |= dep.LV, head.LD |= dep.LD;
40}
41
42
43void SGraph::update_right(int headind, int depind)
44{
45  SNode &head=nodes[headind], &dep=nodes[depind];
46
47  dep.LH.set(headind);
48  if(head.saturated())
49    dep.LH |= head.LH;
50}
51
52
53int SGraph::clone(int ancind, NodeProp newprop)
54{
55  int newind = n++;
56  SNode &newnode=nodes[newind];
57  SNode &ancnode = nodes[ancind];
58
59  newnode.clear();
60  newnode.prop=newprop;
61  newnode.mnode=ancnode.mnode;
62  newnode.mnode->snodes.push_back(newind);
63  return newind;
64}
65
66
67//-------------------------------------------------------------------------
68//-------------------------------------------------------------------------
69
70
71int SGraph::print_node(FILE* f, int n, unsigned int info)
72{
73  char buf[1000];
74  sprint_node(buf,n,info);
75  fputs(buf,f);
76}
77
78int SGraph::sprint_node(char* buf, int nodeind, unsigned int info)
79{
80  char* buf0=buf;
81  char descr[256];
82  char nodeinfo[16];
83
84  SNode &node=nodes[nodeind];
85
86  buf+=sprintf(buf," dgp:%d",nodeind);
87  buf+=sprintf(buf, saturated(nodeind) ? ";s" : ";u");
88
89  bool cont=false;
90  if (info&HEADS)
91  {
92    buf+=sprintf(buf,";");
93    for(vector<Arc>::iterator h=node.heads.begin(); h!=node.heads.end(); ++h)
94    {
95      if(cont) buf+=sprintf(buf,","); else cont=true;
96      buf+=sprintf(buf,"++%s-%d/%d",h->role.str(),h->dst,h->anc);
97    }
98  }
99 
100  if (info&DEPS)
101  {
102    buf+=sprintf(buf,";");
103    for(vector<Arc>::iterator d=node.deps.begin(); d!=node.deps.end(); ++d)
104    {
105      //      if(! nodes[d->dst].saturated()) continue; // NIE DRUKUJ NIENASYCONYCH PODRZEDNIKOW
106      if(cont) buf+=sprintf(buf,","); else cont=true;
107      buf+=sprintf(buf,"--%s-%d/%d",d->role.str(),d->dst,d->anc);
108    }
109  }
110 
111  if (info&SETS)
112  {
113    int ord=0;
114    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)
117        buf+=sprintf(buf, ord++ ? ",%d" : "%d", *ps);
118    buf+=sprintf(buf,"};{");
119    ord=0;for(int j=0; j<=n; ++j) if(node.LV[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j);
120    buf+=sprintf(buf,"};{");
121    ord=0;for(int j=0; j<=n; ++j) if(node.LH[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j);
122    buf+=sprintf(buf,"};{");
123    ord=0;for(int j=0; j<=n; ++j) if(node.LD[j]) buf+=sprintf(buf, ord++ ? ",%d" : "%d", j);
124    buf+=sprintf(buf,"}");
125  }
126
127  if (info&CONSTRAINTS)//  buf+=sprint_node_constraints(buf,n);
128  {
129    buf+=sprintf(buf,";");
130    int cont=0;
131    for(Role i=1; i<=Role::count(); ++i)
132      if(node.prop.forbidden[i]) buf+=sprintf(buf,"%s!%s",(cont++)?",":"",i.str());
133    for(Role i=1; i<=Role::count(); ++i)
134      if(node.prop.required[i]) buf+=sprintf(buf,"%s&%s",(cont++)?",":"",i.str());
135  }
136 
137//   buf+=sprintf(buf,"\n");
138 
139  return buf-buf0;
140}
141
142
143int SGraph::sprint_node_debug(char* buf, const char* pref, int n)
144{
145  char *buf0 = buf;
146  buf+=sprintf(buf,"#%s",pref);
147  buf+=sprint_node(buf,n,HEADS|DEPS|SETS|CONSTRAINTS);
148  buf+=sprintf(buf,"\n");
149  return buf-buf0;
150}
151
152int 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
159void 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 TracBrowser for help on using the repository browser.