def buildCallGraph(self): g = CGraph() ep = self.pyew.ep try: l = set(self.pyew.exports.keys()) l.add(self.pyew.ep) except: print "Error:", sys.exc_info()[1] l = set([self.pyew.ep]) raise functions = [] nodes = {} """ Compute the entry points initial graph """ for ep in l: if self.pyew.functions.has_key(ep): fep = self.pyew.functions[ep] for c in fep.connections: if c in self.pyew.functions: if c not in functions: functions.append(c) if self.pyew.names[ep] not in nodes: n1 = CNode(self.pyew.names[ep]) nodes[self.pyew.names[ep]] = n1 else: n1 = nodes[self.pyew.names[ep]] if self.pyew.names[c] not in nodes: n2 = CNode(self.pyew.names[c]) nodes[self.pyew.names[c]] = n2 else: n2 = nodes[self.pyew.names[c]] g.addEdge(n1, n2) """ Add all the remaining functions """ dones = set() while len(functions) > 0: addr = functions.pop() f = self.pyew.functions[addr] for c in f.connections: if c in self.pyew.functions and c not in dones: functions.append(c) dones.add(c) if self.pyew.names[addr] not in nodes: n1 = CNode(self.pyew.names[addr]) nodes[self.pyew.names[addr]] = n1 else: n1 = nodes[self.pyew.names[addr]] if self.pyew.names[c] not in nodes: n2 = CNode(self.pyew.names[c]) nodes[self.pyew.names[c]] = n2 else: n2 = nodes[self.pyew.names[c]] g.addEdge(n1, n2) return g
def buildFlowGraph(self, f): fg = CGraph() func = self.pyew.functions[f] bbs = {} nodes = {} for bb in func.basic_blocks: instructions = set() bb_start = bb.instructions[0].offset end_offset = bb.instructions[-1].offset bb_end = end_offset + bb.instructions[-1].size buf = self.pyew.getBytes(bb_start, bb_end-bb_start) instructions = self.pyew.disassemble(buf=buf, baseoffset=bb_start, marker=False) instructions = instructions.split("\n") if instructions[-1] == "": del instructions[len(instructions)-1] bbs[bb_start] = instructions bbs[end_offset] = instructions n = CNode(str(bb.offset), data=instructions) fg.addNode(n) nodes[bb.offset] = n for bb in func.basic_blocks: next_head = self.pyew.NextHead(bb.instructions[-1].offset) for conn in bb.connections: a, b = conn if nodes.has_key(b) and nodes.has_key(bb.offset): if len(bb.connections) == 1: color = 0 # edge always elif next_head == b: color = 2 # edge false or unknown else: color = 1 # edge true fg.addEdge(nodes[bb.offset], nodes[b], value=color) return fg
def GET(self): if not 'user' in session or session.user is None: f = register_form() return render.login(f) i = web.input(id=None) if i.id is None or not i.id.isdigit(): return render.error("No cluster id specified or invalid one.") db = open_db() where = "id = $id" sql_vars = {"id": int(i.id)} ret = db.select("clusters", what="graph", vars=sql_vars, where=where) rows = list(ret) if len(rows) == 0: return render.error("Invalid cluster id.") g_text = rows[0]["graph"] g = CGraph() g.fromDict(json.loads(g_text)) json_graph = graph2json(g) return json_graph
def GET(self): if not 'user' in session or session.user is None: f = register_form() return render.login(f) i = web.input(id=None) if i.id is None or not i.id.isdigit(): return render.error("No cluster id specified or invalid one.") db = open_db() where = "id = $id" sql_vars = {"id": int(i.id)} ret = db.select("clusters", what="graph", vars=sql_vars, where=where) rows = list(ret) if len(rows) == 0: return render.error("Invalid cluster id.") g_text = rows[0]["graph"] g = CGraph() g.fromDict(json.loads(g_text)) for node in list(g.nodes()): if node.name.startswith("New node "): g.renameNode(node.name, node.name.replace("New node ", "Cluster ")) else: data = get_sample_data(node.name) tmp = "%s%s" if data["description"] is not None: tmp %= (data["description"], " - " + data["hash"]) else: tmp %= (data["hash"], "") g.renameNode(node.name, tmp) dot = g.toGml() return dot
def make_tree_for(self, group): """ Make a phylogenetic tree for the given group. """ l = list(group) l.sort() s = str(l) if s in self.groups_done: if self.debug: print "Already clustered group found, skipping..." return None g = CGraph() g.letter = self.ascii_letters[self.last_letter] self.last_letter += 1 group = list(group) dm = self.diff_matrix parent = None name = "New node %d" node_num = 0 nodes = {} previous_node_name = node_name = None total_groups = len(group) - 1 groups = 0 for it in xrange(len(group) - 1): groups += 1 node_num += 1 # start by building a smaller difference matrix only for the samples # in this specific group dm = self.get_diff_matrix_for(group, dm) qm, lowest = self.get_q_matrix(dm) group = dm.keys() new_group = list(group) # Build a new node with the highest value found so far if node_name is not None: previous_node_name = node_name node_name = name % node_num n = CNode(node_name, shape="point") g.addNode(n) nodes[node_name] = n if parent is None: parent = n # Create the edges between the new node 'n' and the samples wih the # lowest Q matrix value if it != 0: lowest = None n1, n2 = self.get_neighbors(qm, group, lowest, previous_node_name) if not nodes.has_key(n1): nodes[n1] = CNode(n1) if not nodes.has_key(n2): nodes[n2] = CNode(n2) dfu = dgu = 0 #self.get_dfg_distances(n1, n2, dm) if not g.edgeExists(nodes[n1], n): g.addEdge(n, nodes[n1], check_dups=True, label=str(dfu)) if not g.edgeExists(nodes[n2], n): g.addEdge(n, nodes[n2], check_dups=True, label=str(dgu)) if n1 in new_group: new_group.remove(n1) if n2 in new_group: new_group.remove(n2) new_group.append(node_name) dm = self.update_diff_matrix(node_name, n1, n2, new_group, dm) group = new_group self.groups_done.add(s) return g