3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-16 13:58:45 +00:00
z3/src/smt/spanning_tree.h
Nikolaj Bjorner d0e20e44ff booyah
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2020-07-04 15:56:30 -07:00

81 lines
2.3 KiB
C++

/*++
Copyright (c) 2013 Microsoft Corporation
Module Name:
spanning_tree.h
Abstract:
Represent spanning trees with needed operations for Network Simplex
Author:
Anh-Dung Phan (t-anphan) 2013-11-06
Notes:
--*/
#pragma once
#include "smt/diff_logic.h"
#include "smt/spanning_tree_base.h"
namespace smt {
template<typename Ext>
class thread_spanning_tree : public spanning_tree_base, protected Ext {
protected:
typedef dl_edge<Ext> edge;
typedef dl_graph<Ext> graph;
typedef typename Ext::numeral numeral;
typedef typename Ext::fin_numeral fin_numeral;
// Store the parent of a node i in the spanning tree
svector<node_id> m_pred;
// Store the number of edge on the path from node i to the root
svector<int> m_depth;
svector<node_id> m_thread; // Store the pointer from node i to the next node in depth-first search order
svector<edge_id> m_tree; // i |-> edge between (i, m_pred[i])
node_id m_root_t2;
graph & m_graph;
void swap_order(node_id q, node_id v);
node_id find_rev_thread(node_id n) const;
void fix_depth(node_id start, node_id after_end);
node_id get_final(int start);
bool is_preorder_traversal(node_id start, node_id end);
node_id get_common_ancestor(node_id u, node_id v);
bool is_forward_edge(edge_id e_id) const;
bool is_ancestor_of(node_id ancestor, node_id child);
public:
thread_spanning_tree(graph & g);
virtual void initialize(svector<edge_id> const & tree);
void get_descendants(node_id start, svector<node_id> & descendants);
virtual void update(edge_id enter_id, edge_id leave_id);
void get_path(node_id start, node_id end, svector<edge_id> & path, bool_vector & against);
bool in_subtree_t2(node_id child);
bool check_well_formed();
};
template<typename Ext>
class basic_spanning_tree : public thread_spanning_tree<Ext> {
private:
graph * m_tree_graph;
public:
basic_spanning_tree(graph & g);
void initialize(svector<edge_id> const & tree);
void update(edge_id enter_id, edge_id leave_id);
};
}