mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	reorganizing the code
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
		
							parent
							
								
									61bd5a69ec
								
							
						
					
					
						commit
						12a255e36b
					
				
					 195 changed files with 11 additions and 526 deletions
				
			
		
							
								
								
									
										158
									
								
								src/test/fvi.cpp
									
										
									
									
									
								
							
							
						
						
									
										158
									
								
								src/test/fvi.cpp
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,158 +0,0 @@
 | 
			
		|||
/*++
 | 
			
		||||
Copyright (c) 2006 Microsoft Corporation
 | 
			
		||||
 | 
			
		||||
Module Name:
 | 
			
		||||
 | 
			
		||||
    fvi.cpp
 | 
			
		||||
 | 
			
		||||
Abstract:
 | 
			
		||||
 | 
			
		||||
    Feature Vector Indexing.
 | 
			
		||||
 | 
			
		||||
Author:
 | 
			
		||||
 | 
			
		||||
    Leonardo de Moura (leonardo) 2008-02-01.
 | 
			
		||||
 | 
			
		||||
Revision History:
 | 
			
		||||
 | 
			
		||||
--*/
 | 
			
		||||
#ifdef _WINDOWS
 | 
			
		||||
#include"fvi_def.h"
 | 
			
		||||
#include"trace.h"
 | 
			
		||||
 | 
			
		||||
typedef vector<int> data;
 | 
			
		||||
 | 
			
		||||
static int to_feature(int val) {
 | 
			
		||||
    return val % 4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static std::ostream & operator<<(std::ostream & out, data const & d) {
 | 
			
		||||
    out << "["; 
 | 
			
		||||
    data::const_iterator it  = d.begin();
 | 
			
		||||
    data::const_iterator end = d.end();
 | 
			
		||||
    for (bool first = true; it != end; ++it, first = false)
 | 
			
		||||
        out << (first ? "" : " ") << *it << ":" << to_feature(*it);
 | 
			
		||||
    out << "]";
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define NUM_FEATURES 5
 | 
			
		||||
 | 
			
		||||
struct to_feature_vector {
 | 
			
		||||
    unsigned m_num_features;
 | 
			
		||||
 | 
			
		||||
    to_feature_vector(unsigned n):m_num_features(n) {}
 | 
			
		||||
 | 
			
		||||
    void operator()(data * d, unsigned * f) {
 | 
			
		||||
        for (unsigned i = 0; i < m_num_features; i++) {
 | 
			
		||||
            f[i] = to_feature((*d)[i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct data_hash {
 | 
			
		||||
    unsigned operator()(data * d) const {
 | 
			
		||||
        unsigned r = 0;
 | 
			
		||||
        data::iterator it  = d->begin();
 | 
			
		||||
        data::iterator end = d->end();
 | 
			
		||||
        for (; it != end; ++it) 
 | 
			
		||||
            r += *it;
 | 
			
		||||
        return r;
 | 
			
		||||
    } 
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
ptr_vector<data> g_datas;
 | 
			
		||||
 | 
			
		||||
static void collect() {
 | 
			
		||||
    std::for_each(g_datas.begin(), g_datas.end(), delete_proc<data>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static data * mk_random_data() {
 | 
			
		||||
    data * d = alloc(data);
 | 
			
		||||
    for (unsigned i = 0; i < NUM_FEATURES; i++)
 | 
			
		||||
        d->push_back(rand() % 1000);
 | 
			
		||||
    g_datas.push_back(d);
 | 
			
		||||
    return d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct le_visitor {
 | 
			
		||||
    data * m_data;
 | 
			
		||||
 | 
			
		||||
    le_visitor(data * d):m_data(d) {}
 | 
			
		||||
 | 
			
		||||
    bool operator()(data * other) {
 | 
			
		||||
        // TRACE("fvi", tout << *other << " <= " << *m_data << "\n";);
 | 
			
		||||
        for (unsigned i = 0; i < NUM_FEATURES; i++) {
 | 
			
		||||
            SASSERT(to_feature((*other)[i]) <= to_feature((*m_data)[i]));
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void tst1(unsigned n1) {
 | 
			
		||||
    typedef fvi<data, to_feature_vector, data_hash> data_set;
 | 
			
		||||
    data_set index1(NUM_FEATURES, to_feature_vector(NUM_FEATURES));
 | 
			
		||||
    ptr_vector<data> index2;
 | 
			
		||||
    
 | 
			
		||||
    for (unsigned i = 0; i < n1; i++) {
 | 
			
		||||
        int op = rand()%6;
 | 
			
		||||
        if (op < 3) {
 | 
			
		||||
            data * d = mk_random_data();
 | 
			
		||||
            if (!index1.contains(d)) {
 | 
			
		||||
                // TRACE("fvi", tout << "inserting: " << *d << "\n";);
 | 
			
		||||
                index1.insert(d);
 | 
			
		||||
                index2.push_back(d);
 | 
			
		||||
                SASSERT(std::find(index2.begin(), index2.end(), d) != index2.end());
 | 
			
		||||
                SASSERT(index1.contains(d));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else if (op < 4) {
 | 
			
		||||
            if (!index2.empty()) {
 | 
			
		||||
                unsigned idx = rand() % index2.size();
 | 
			
		||||
                if (index2[idx]) {
 | 
			
		||||
                    SASSERT(index1.contains(index2[idx]));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else if (op < 5) {
 | 
			
		||||
            if (!index2.empty()) {
 | 
			
		||||
                unsigned idx = rand() % index2.size();
 | 
			
		||||
                if (index2[idx]) {
 | 
			
		||||
                    // TRACE("fvi", tout << "erasing: " << *(index2[idx]) << "\n";);
 | 
			
		||||
                    index1.erase(index2[idx]);
 | 
			
		||||
                    SASSERT(!index1.contains(index2[idx]));
 | 
			
		||||
                    index2[idx] = 0;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            if (!index2.empty()) {
 | 
			
		||||
                unsigned idx = rand() % index2.size();
 | 
			
		||||
                data * d = index2[idx];
 | 
			
		||||
                if (d)
 | 
			
		||||
                    index1.visit(d, le_visitor(d));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    TRACE("fvi",
 | 
			
		||||
          data_set::statistics s;
 | 
			
		||||
          index1.stats(s);
 | 
			
		||||
          tout << "size:           " << s.m_size << "\n";
 | 
			
		||||
          tout << "num. nodes:     " << s.m_num_nodes << "\n";
 | 
			
		||||
          tout << "num. leaves:    " << s.m_num_leaves << "\n";
 | 
			
		||||
          tout << "min. leaf size: " << s.m_min_leaf_size << "\n";
 | 
			
		||||
          tout << "max. leaf size: " << s.m_max_leaf_size << "\n";
 | 
			
		||||
          );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void tst_fvi() {
 | 
			
		||||
    for (unsigned i = 0; i < 1000; i++) 
 | 
			
		||||
        tst1(100);
 | 
			
		||||
    tst1(10000);
 | 
			
		||||
    collect();
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
void tst_fvi() {
 | 
			
		||||
}
 | 
			
		||||
#endif 
 | 
			
		||||
| 
						 | 
				
			
			@ -151,8 +151,6 @@ int main(int argc, char ** argv) {
 | 
			
		|||
    TST(list);
 | 
			
		||||
    TST(small_object_allocator);
 | 
			
		||||
    TST(timeout);
 | 
			
		||||
    TST(splay_tree);
 | 
			
		||||
    TST(fvi);
 | 
			
		||||
    TST(proof_checker);
 | 
			
		||||
    TST(simplifier);
 | 
			
		||||
    TST(bv_simplifier_plugin);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,175 +0,0 @@
 | 
			
		|||
/*++
 | 
			
		||||
Copyright (c) 2006 Microsoft Corporation
 | 
			
		||||
 | 
			
		||||
Module Name:
 | 
			
		||||
 | 
			
		||||
    splay_tree.cpp
 | 
			
		||||
 | 
			
		||||
Abstract:
 | 
			
		||||
 | 
			
		||||
    Splay trees
 | 
			
		||||
 | 
			
		||||
Author:
 | 
			
		||||
 | 
			
		||||
    Leonardo de Moura (leonardo) 2008-01-31.
 | 
			
		||||
 | 
			
		||||
Revision History:
 | 
			
		||||
 | 
			
		||||
--*/
 | 
			
		||||
 | 
			
		||||
#include"splay_tree_map.h"
 | 
			
		||||
#include"splay_tree_def.h"
 | 
			
		||||
#include"trace.h"
 | 
			
		||||
#include"vector.h"
 | 
			
		||||
#include"map.h"
 | 
			
		||||
#include"timeit.h"
 | 
			
		||||
 | 
			
		||||
struct icomp {
 | 
			
		||||
    int operator()(int k1, int k2) const {
 | 
			
		||||
        return k1 - k2;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct visitor {
 | 
			
		||||
    bool     m_out;
 | 
			
		||||
    int      m_prev;
 | 
			
		||||
    unsigned m_num;
 | 
			
		||||
 | 
			
		||||
    visitor(bool f = true):m_out(f), m_prev(-1), m_num(0) {}
 | 
			
		||||
 | 
			
		||||
    void operator()(int k, int d) { 
 | 
			
		||||
        SASSERT(m_prev < k); 
 | 
			
		||||
        SASSERT(d == 2 * k); 
 | 
			
		||||
        m_num++; 
 | 
			
		||||
        m_prev = k;
 | 
			
		||||
        if (m_out) {
 | 
			
		||||
            TRACE_CODE(tout << k << " ";);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void tst1(unsigned n) {
 | 
			
		||||
    splay_tree_map<int, int, icomp> s1;
 | 
			
		||||
    svector<bool> s2(n, false);
 | 
			
		||||
    unsigned       size = 0;
 | 
			
		||||
 | 
			
		||||
    unsigned num_op = rand()%1000;
 | 
			
		||||
    for (unsigned i = 0; i < num_op; i++) {
 | 
			
		||||
        unsigned op = rand()%5;
 | 
			
		||||
        if (op < 3) {
 | 
			
		||||
            unsigned idx = rand() % n;
 | 
			
		||||
            TRACE("splay_tree_detail", tout << "inserting: " << idx << "\n";);
 | 
			
		||||
            if (!s2[idx]) {
 | 
			
		||||
                size++;
 | 
			
		||||
            }
 | 
			
		||||
            s2[idx] = true;
 | 
			
		||||
            s1.insert(idx, idx*2);
 | 
			
		||||
        }
 | 
			
		||||
        else if (op < 4) {
 | 
			
		||||
            unsigned idx = rand() % n;
 | 
			
		||||
            TRACE("splay_tree_detail", tout << "erasing: " << idx << "\n";);
 | 
			
		||||
            if (s2[idx]) {
 | 
			
		||||
                size--;
 | 
			
		||||
            }
 | 
			
		||||
            s2[idx] = false;
 | 
			
		||||
            s1.erase(idx);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            SASSERT((size == 0) == s1.empty());
 | 
			
		||||
            for (unsigned idx = 0; idx < n; idx++) {
 | 
			
		||||
                unsigned idx2 = rand() % n;
 | 
			
		||||
                DEBUG_CODE(
 | 
			
		||||
                    int v;
 | 
			
		||||
                    SASSERT(s2[idx2] == s1.find(idx2, v));
 | 
			
		||||
                    SASSERT(!s2[idx2] || v == 2*idx2);
 | 
			
		||||
                    );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        TRACE("splay_tree", 
 | 
			
		||||
              visitor v;
 | 
			
		||||
              s1.visit(v);
 | 
			
		||||
              tout << "\n";
 | 
			
		||||
              int idx = rand()%n;
 | 
			
		||||
              tout << "smaller than: " << idx << "\n";
 | 
			
		||||
              visitor v2;
 | 
			
		||||
              s1.visit_le(v2, idx);
 | 
			
		||||
              tout << "\n";
 | 
			
		||||
              tout << "greater than: " << idx << "\n";
 | 
			
		||||
              visitor v3;
 | 
			
		||||
              s1.visit_ge(v3, idx);
 | 
			
		||||
              tout << "\n";);
 | 
			
		||||
 | 
			
		||||
        visitor v(false);
 | 
			
		||||
        s1.visit(v);
 | 
			
		||||
        CTRACE("splay_tree", v.m_num != size, s1.display(tout); tout << "\n";);
 | 
			
		||||
        SASSERT(v.m_num == size);
 | 
			
		||||
    }
 | 
			
		||||
    s1.reset();
 | 
			
		||||
    SASSERT(s1.empty());
 | 
			
		||||
    TRACE("splay_tree", 
 | 
			
		||||
          visitor v;;
 | 
			
		||||
          s1.visit(v);
 | 
			
		||||
          SASSERT(v.m_num == 0);
 | 
			
		||||
          tout << "\n";);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void tst_perf(int n1, int n2, int n3, int n4, int n5) {
 | 
			
		||||
    u_map<int> values1;
 | 
			
		||||
    svector<int> idxs;
 | 
			
		||||
    splay_tree_map<int, int, icomp> values2;
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        timeit t(true, "building: ");
 | 
			
		||||
        for (int i = 0; i < n2; i++) {
 | 
			
		||||
            int idx = rand() % n1;
 | 
			
		||||
            idxs.push_back(idx);
 | 
			
		||||
            values1.insert(idxs[i], i);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < n2; i++) {
 | 
			
		||||
            values2.insert(idxs[i], i);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    int s1, s2;
 | 
			
		||||
    {
 | 
			
		||||
        timeit t(true, "u_map: ");
 | 
			
		||||
        s1 = 0;
 | 
			
		||||
        for (int j = 0; j < n4; j++) {
 | 
			
		||||
            for (int i = 0; i < n5; i++) {
 | 
			
		||||
                int v;
 | 
			
		||||
                values1.find(idxs[i], v);
 | 
			
		||||
                s1 += v;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    std::cout << s1 << "\n";
 | 
			
		||||
    {
 | 
			
		||||
        timeit t(true, "splay_tree: ");
 | 
			
		||||
        s2 = 0;
 | 
			
		||||
        for (int j = 0; j < n4; j++) {
 | 
			
		||||
            for (int i = 0; i < n5; i++) {
 | 
			
		||||
                int v;
 | 
			
		||||
                values2.find(idxs[i], v);
 | 
			
		||||
                s2 += v;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // for (int i = 0; i < n5; i++) {
 | 
			
		||||
        //    std::cout << idxs[i] << " ";
 | 
			
		||||
        // }
 | 
			
		||||
        std::cout << "\n";
 | 
			
		||||
        // values2.display(std::cout);
 | 
			
		||||
    }
 | 
			
		||||
    std::cout << s2 << "\n";
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void tst_splay_tree() {
 | 
			
		||||
    for (unsigned i = 0; i < 100; i++) {
 | 
			
		||||
        tst1(1 + rand()%31);
 | 
			
		||||
        tst1(1 + rand()%100);
 | 
			
		||||
    }
 | 
			
		||||
    // tst_perf(10000000, 1000000, 10000, 1000000, 100);
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue