ROSE  0.11.96.11
TreeEditDistance.h
1 #ifndef ROSE_EditDistance_TreeEditDistance_H
2 #define ROSE_EditDistance_TreeEditDistance_H
3 
4 #include <Rose/Diagnostics.h>
5 
6 #include <boost/graph/adjacency_list.hpp>
7 #include <boost/graph/graph_traits.hpp>
8 
9 #include <map>
10 #include <string>
11 #include <vector>
12 
13 namespace Rose {
14 namespace EditDistance { // documented elsewhere
15 
45 namespace TreeEditDistance {
46 
47 // Any header that #defines words that are this common is just plain stupid!
48 #if defined(INSERT) || defined(DELETE) || defined(SUBSTITUTE)
49 # ifdef _MSC_VER
50 # pragma message("Undefining common words from the global namespace: INSERT DELETE SUBSTITUTE")
51 # else
52 # warning "Undefining common words from the global namespace: INSERT DELETE SUBSTITUTE"
53 # endif
54 # undef INSERT
55 # undef DELETE
56 # undef SUBSTITUTE
57 #endif
58 
60 enum EditType {
64 };
65 
67 struct Edit {
71  double cost;
74  void print(std::ostream&) const;
75 };
76 
78 typedef std::vector<Edit> Edits;
79 
84 public:
85  virtual ~SubstitutionPredicate() {}
86 
88  virtual bool operator()(SgNode *source, SgNode *target) = 0;
89 };
90 
95 class Analysis {
96  // Graph used for computing Dijkstra's shortest path (DSP).
97  typedef boost::property<boost::edge_weight_t, double> EdgeProperty;
98  typedef boost::adjacency_list<boost::listS, // edge representation
99  boost::vecS, // vertex representation
100  boost::directedS, // edges are directed
101  boost::no_property, // vertex values
102  EdgeProperty // edge values
103  > Graph;
104  typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
105  typedef std::pair<size_t, size_t> Edge; // source and target vertex IDs
106 
107  double insertionCost_; // non-negative cost for insertion edit
108  double deletionCost_; // non-negative cost for deletion edit
109  double substitutionCost_; // non-negative cost for substitution edit
110 
111  SgNode *ast1_, *ast2_; // trees being compared
112  std::vector<SgNode*> nodes1_, nodes2_; // list of nodes from parts of trees being compared
113  std::vector<size_t> depths1_, depths2_; // subtree depths for nodes1_ and nodes2_
114  Graph graph_; // graph connectivity and edge weights
115  std::vector<double> totalCost_; // total cost of minimal-cost path from origin to each vertex
116  std::vector<Vertex> predecessors_; // predecessor vertex for each node in minimal-cost path from origin
117  SubstitutionPredicate *substitutionPredicate_; // determines whether one node can be substituted for another
118 
119 public:
122  : insertionCost_(1.0), deletionCost_(1.0), substitutionCost_(1.0), ast1_(NULL), ast2_(NULL),
123  substitutionPredicate_(NULL) {}
124 
130  ast1_ = ast2_ = NULL;
131  nodes1_.clear(), nodes2_.clear();
132  depths1_.clear(), depths2_.clear();
133  graph_ = Graph();
134  totalCost_.clear(), predecessors_.clear();
135  return *this;
136  }
137 
143  double insertionCost() const {
144  return insertionCost_;
145  }
146  Analysis& insertionCost(double weight) {
147  ASSERT_require(weight >= 0.0);
148  insertionCost_ = weight;
149  return *this;
150  }
158  double deletionCost() const {
159  return deletionCost_;
160  }
161  Analysis& deletionCost(double weight) {
162  ASSERT_require(weight >= 0.0);
163  deletionCost_ = weight;
164  return *this;
165  }
173  double substitutionCost() const {
174  return substitutionCost_;
175  }
176  Analysis& substitutionCost(double weight) {
177  ASSERT_require(weight >= 0.0);
178  substitutionCost_ = weight;
179  return *this;
180  }
191  return substitutionPredicate_;
192  }
194  substitutionPredicate_ = predicate;
195  return *this;
196  }
232  Analysis& compute(SgNode *source, SgNode *target, SgFile *sourceFile=NULL, SgFile *targetFile=NULL);
233  Analysis& compute(SgNode *target, SgFile *targetFile=NULL);
234  Analysis& compute();
241  double cost() const;
242 
247  double relativeCost() const;
248 
250  Edits edits() const;
251 
253  std::pair<SgNode*, SgNode*> trees() const {
254  return std::make_pair(ast1_, ast2_);
255  }
256 
260  const std::vector<SgNode*>& sourceTreeNodes() const {
261  return nodes1_;
262  }
263  const std::vector<SgNode*>& targetTreeNodes() const {
264  return nodes2_;
265  }
272  std::pair<size_t, size_t> graphSize() const;
273 
285  void emitGraphViz(std::ostream&) const;
286 
292  Analysis& setTree1(SgNode *ast, SgFile *file=NULL);
293  Analysis& setTree2(SgNode *ast, SgFile *file=NULL);
295 };
296 
297 std::ostream& operator<<(std::ostream&, const TreeEditDistance::Edit&);
298 
299 } // namespace
300 } // namespace
301 } // namespace
302 
303 #endif
Rose::EditDistance::TreeEditDistance::DELETE
@ DELETE
Delete a node from this tree.
Definition: TreeEditDistance.h:62
Rose::EditDistance::TreeEditDistance::INSERT
@ INSERT
Insert a node from another tree.
Definition: TreeEditDistance.h:61
Rose::EditDistance::TreeEditDistance::Analysis
Analysis object for tree edit distance.
Definition: TreeEditDistance.h:95
Rose::EditDistance::TreeEditDistance::SubstitutionPredicate::operator()
virtual bool operator()(SgNode *source, SgNode *target)=0
Returns true if target can be substituted for source.
Rose::EditDistance::TreeEditDistance::Analysis::insertionCost
double insertionCost() const
Property: insertion cost.
Definition: TreeEditDistance.h:143
Edge
Definition: SgGraphTemplate.h:12
Rose::EditDistance::TreeEditDistance::Analysis::relativeCost
double relativeCost() const
Relative cost.
Rose::EditDistance::TreeEditDistance::Analysis::clear
Analysis & clear()
Forget calculated results.
Definition: TreeEditDistance.h:129
Rose::EditDistance::TreeEditDistance::Analysis::deletionCost
Analysis & deletionCost(double weight)
Property: deletion cost.
Definition: TreeEditDistance.h:161
Rose::EditDistance::TreeEditDistance::Analysis::trees
std::pair< SgNode *, SgNode * > trees() const
The two trees that were compared.
Definition: TreeEditDistance.h:253
SgFile
This class represents a source file for a project (which may contian many source files and or directo...
Definition: Cxx_Grammar.h:21163
Rose::EditDistance::TreeEditDistance::Analysis::compute
Analysis & compute()
Compute tree edit distances.
Rose::EditDistance::TreeEditDistance::Edit::editType
EditType editType
Type of operation performed.
Definition: TreeEditDistance.h:68
Rose::EditDistance::TreeEditDistance::Edit::sourceNode
SgNode * sourceNode
Node in source tree to be replaced or deleted.
Definition: TreeEditDistance.h:69
Rose::EditDistance::TreeEditDistance::Analysis::deletionCost
double deletionCost() const
Property: deletion cost.
Definition: TreeEditDistance.h:158
Rose::EditDistance::TreeEditDistance::Edit::cost
double cost
Cost for this operation.
Definition: TreeEditDistance.h:71
Rose::EditDistance::TreeEditDistance::Edit
A single edit operation.
Definition: TreeEditDistance.h:67
Rose::EditDistance::TreeEditDistance::Analysis::edits
Edits edits() const
Edit operations to make one path look like another.
Vertex
Definition: SgGraphTemplate.h:7
Rose::EditDistance::TreeEditDistance::Analysis::setTree1
Analysis & setTree1(SgNode *ast, SgFile *file=NULL)
Change one tree or the other.
Rose::EditDistance::TreeEditDistance::Edit::targetNode
SgNode * targetNode
Node in target tree for replacement or insertion.
Definition: TreeEditDistance.h:70
Rose::EditDistance::TreeEditDistance::Analysis::substitutionCost
Analysis & substitutionCost(double weight)
Property: substitution cost.
Definition: TreeEditDistance.h:176
Rose::EditDistance::TreeEditDistance::SubstitutionPredicate
Base class for substitution prediates.
Definition: TreeEditDistance.h:83
Rose::EditDistance::TreeEditDistance::Analysis::substitutionCost
double substitutionCost() const
Property: substitution cost.
Definition: TreeEditDistance.h:173
Rose::EditDistance::TreeEditDistance::Analysis::emitGraphViz
void emitGraphViz(std::ostream &) const
Emit a GraphViz file.
Rose::EditDistance::TreeEditDistance::Analysis::targetTreeNodes
const std::vector< SgNode * > & targetTreeNodes() const
List of nodes in the trees.
Definition: TreeEditDistance.h:263
Rose::EditDistance::TreeEditDistance::Analysis::sourceTreeNodes
const std::vector< SgNode * > & sourceTreeNodes() const
List of nodes in the trees.
Definition: TreeEditDistance.h:260
Rose::EditDistance::TreeEditDistance::Analysis::cost
double cost() const
Total cost for making one tree the same shape as the other.
SgNode
This class represents the base class for all IR nodes within Sage III.
Definition: Cxx_Grammar.h:6739
Rose::EditDistance::TreeEditDistance::Analysis::setTree2
Analysis & setTree2(SgNode *ast, SgFile *file=NULL)
Change one tree or the other.
Rose
Main namespace for the ROSE library.
Definition: BinaryTutorial.dox:3
Rose::EditDistance::TreeEditDistance::Analysis::substitutionPredicate
Analysis & substitutionPredicate(SubstitutionPredicate *predicate)
Property: substitution predicate.
Definition: TreeEditDistance.h:193
Rose::EditDistance::TreeEditDistance::Edits
std::vector< Edit > Edits
List of edit operations.
Definition: TreeEditDistance.h:78
Rose::EditDistance::TreeEditDistance::SUBSTITUTE
@ SUBSTITUTE
Substitute a node; same as an insert-delete pair.
Definition: TreeEditDistance.h:63
Rose::EditDistance::TreeEditDistance::Analysis::insertionCost
Analysis & insertionCost(double weight)
Property: insertion cost.
Definition: TreeEditDistance.h:146
Rose::EditDistance::TreeEditDistance::EditType
EditType
Type of edit operation.
Definition: TreeEditDistance.h:60
Rose::EditDistance::TreeEditDistance::Analysis::graphSize
std::pair< size_t, size_t > graphSize() const
Number of vertices and edges in the graph.
Rose::EditDistance::TreeEditDistance::Analysis::Analysis
Analysis()
Construct an analysis with default values.
Definition: TreeEditDistance.h:121
Rose::EditDistance::TreeEditDistance::Analysis::substitutionPredicate
SubstitutionPredicate * substitutionPredicate() const
Property: substitution predicate.
Definition: TreeEditDistance.h:190