mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	na
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									6a8ac5f9b1
								
							
						
					
					
						commit
						0557d72d1c
					
				
					 4 changed files with 32 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -25,45 +25,60 @@ namespace simplex {
 | 
			
		|||
 | 
			
		||||
    class sparse_matrix_ops {
 | 
			
		||||
    public:
 | 
			
		||||
        static void kernel(sparse_matrix<mpq_ext>& M, vector<vector<mpq>>& K) {
 | 
			
		||||
        static void kernel(sparse_matrix<mpq_ext>& M, vector<vector<rational>>& K) {
 | 
			
		||||
            mpq_ext::numeral coeff;
 | 
			
		||||
            vector<unsigned> d;
 | 
			
		||||
            bool_vector c;
 | 
			
		||||
            rational D1, D2;
 | 
			
		||||
            vector<unsigned> d, c;
 | 
			
		||||
            unsigned m = M.num_vars();
 | 
			
		||||
            auto& mgr = M.get_manager();
 | 
			
		||||
            for (unsigned v = 0; v < m; ++v)
 | 
			
		||||
                c.push_back(false);
 | 
			
		||||
                c.push_back(0);
 | 
			
		||||
            
 | 
			
		||||
            for (auto const& row : M.get_rows()) {
 | 
			
		||||
                // scan for non-zero variable in row
 | 
			
		||||
                bool found = false;
 | 
			
		||||
                d.push_back(0);
 | 
			
		||||
                for (auto const& [coeff1, v] : M.get_row(row)) {
 | 
			
		||||
                for (auto& [coeff1, v] : M.get_row(row)) {
 | 
			
		||||
                    if (mpq_manager<false>::is_zero(coeff1))
 | 
			
		||||
                        continue;
 | 
			
		||||
                    if (c[v])
 | 
			
		||||
                    if (c[v] != 0)
 | 
			
		||||
                        continue;
 | 
			
		||||
                    d.back() = v + 1;
 | 
			
		||||
                    c[v] = true;
 | 
			
		||||
                    c[v] = row.id() + 1;
 | 
			
		||||
                    D1 = rational(-1) / coeff1;
 | 
			
		||||
                    mgr.set(coeff1, mpq(-1));
 | 
			
		||||
                    // eliminate v from other rows.
 | 
			
		||||
                    for (auto const& [row2, row_entry2] : M.get_rows(v)) {
 | 
			
		||||
                        if (row.id() == row2.id())
 | 
			
		||||
                        if (row.id() >= row2.id() || row_entry2->m_coeff == 0)
 | 
			
		||||
                            continue;
 | 
			
		||||
                        if (row_entry2->m_coeff == 0)
 | 
			
		||||
                        for (auto& [coeff2, w] : M.get_row(row2)) {
 | 
			
		||||
                            if (v == w)
 | 
			
		||||
                                mgr.set(coeff2, (D1*coeff2).to_mpq());
 | 
			
		||||
                        }                        
 | 
			
		||||
                    }
 | 
			
		||||
                    
 | 
			
		||||
                    for (auto& [coeff2, w] : M.get_row(row)) {
 | 
			
		||||
                        if (v == w)
 | 
			
		||||
                            continue;
 | 
			
		||||
                        M.get_manager().set(coeff, (- row_entry2->m_coeff / coeff1).to_mpq());
 | 
			
		||||
                        M.add(row2, coeff, row);
 | 
			
		||||
                        D2 = coeff2;
 | 
			
		||||
                        mgr.set(coeff2, mpq(0));
 | 
			
		||||
                        for (auto const& [row2, row_entry2] : M.get_rows(w)) {
 | 
			
		||||
                            if (row.id() >= row2.id() || row_entry2->m_coeff == 0 || row_entry2->m_var == v)
 | 
			
		||||
                                continue;
 | 
			
		||||
                            // mgr.set(row_entry2->m_coeff, row_entry2->m_coeff + D2*row2[v]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                }                
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            M.get_manager().del(coeff);
 | 
			
		||||
            mgr.del(coeff);
 | 
			
		||||
 | 
			
		||||
            // TODO: extract kernel using d
 | 
			
		||||
            for (unsigned k = 0; k < d.size(); ++k) {
 | 
			
		||||
                if (d[k] != 0)
 | 
			
		||||
                    continue;
 | 
			
		||||
                K.push_back(vector<mpq>());
 | 
			
		||||
                K.push_back(vector<rational>());
 | 
			
		||||
                for (unsigned i = 0; i < d.size(); ++i) {                    
 | 
			
		||||
                    // K.back().push_back(d[i] > 0 ? M[d[i]-1][k] : (i == k) ? 1 : 0);
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue