ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
fastel.c File Reference
#include "fastel.h"
#include "dense.h"
#include "eliminate.h"
#include "inline.h"
#include "internal.h"
#include "print.h"
#include "rank.h"
#include "report.h"
#include "terminate.h"
#include "weaken.h"
Include dependency graph for fastel.c:

Go to the source code of this file.

Classes

struct  candidate
 

Macros

#define RANK_CANDIDATE(CANDIDATE)
 

Typedefs

typedef struct candidate candidate
 

Functions

typedef STACK (candidate)
 

Macro Definition Documentation

◆ RANK_CANDIDATE

#define RANK_CANDIDATE ( CANDIDATE)
Value:
((CANDIDATE).score)

Typedef Documentation

◆ candidate

typedef struct candidate candidate

Definition at line 819 of file fastel.c.

Function Documentation

◆ STACK()

typedef STACK ( candidate )

Definition at line 820 of file fastel.c.

824 {
825 if (solver->inconsistent)
826 return;
827 if (!GET_OPTION (fastel))
828 return;
829#ifndef KISSAT_QUIET
830 const unsigned variables_before = solver->active;
831#endif
832 KISSAT_assert (!solver->level);
833 START (fastel);
836 const unsigned fastelrounds = GET_OPTION (fastelrounds);
837 const size_t fasteloccs = GET_OPTION (fasteloccs);
838#ifndef KISSAT_QUIET
839 unsigned eliminated = 0;
840#endif
841 unsigned round = 0;
842 candidates candidates;
843 INIT_STACK (candidates);
844 bool done = false;
845 do {
846 if (round++ >= fastelrounds)
847 break;
849 solver, "gathering candidates for fast elimination round %u",
850 round);
851 KISSAT_assert (EMPTY_STACK (candidates));
852 flags *all_flags = solver->flags;
853 for (all_variables (pivot)) {
854 flags *pivot_flags = all_flags + pivot;
855 if (!pivot_flags->active)
856 continue;
857 if (!pivot_flags->eliminate)
858 continue;
859 const unsigned lit = LIT (pivot);
860 const size_t pos = flush_occurrences (solver, lit);
861 if (pos > fasteloccs)
862 continue;
863 const unsigned not_lit = LIT (pivot);
864 const size_t neg = flush_occurrences (solver, not_lit);
865 if (neg > fasteloccs)
866 continue;
867 const unsigned score = pos + neg;
868 if (score > fasteloccs)
869 continue;
870 candidate candidate = {pivot, score};
871 PUSH_STACK (candidates, candidate);
872 }
873#ifndef KISSAT_QUIET
874 const size_t size_candidates = SIZE_STACK (candidates);
875 const size_t active_variables = solver->active;
877 solver, "gathered %zu candidates %.0f%% in elimination round %u",
878 size_candidates, kissat_percent (size_candidates, active_variables),
879 round);
880#endif
881 RADIX_STACK (candidate, unsigned, candidates, RANK_CANDIDATE);
882 unsigned eliminated_this_round = 0;
883 for (all_stack (candidate, candidate, candidates)) {
884 const unsigned pivot = candidate.pivot;
885 flags *pivot_flags = all_flags + pivot;
886 if (!pivot_flags->active)
887 continue;
888 if (!pivot_flags->eliminate)
889 continue;
891 done = true;
892 break;
893 }
894 if (try_to_fast_eliminate (solver, pivot))
895 eliminated_this_round++;
896 if (solver->inconsistent) {
897 done = true;
898 break;
899 }
900 pivot_flags->eliminate = false;
902 if (solver->inconsistent) {
903 done = true;
904 break;
905 }
906 }
907 CLEAR_STACK (candidates);
908#ifndef KISSAT_QUIET
909 eliminated += eliminated_this_round;
911 solver, "fast eliminated %u of %zu candidates %.0f%% in round %u",
912 eliminated_this_round, size_candidates,
913 kissat_percent (eliminated_this_round, size_candidates), round);
914#endif
915 if (!eliminated_this_round)
916 done = true;
917 } while (!done);
918 RELEASE_STACK (candidates);
919 for (all_variables (idx))
920 FLAGS (idx)->eliminate = true;
921 flush_eliminated_binary_clauses (solver);
923#ifndef KISSAT_QUIET
924 const unsigned original_variables = solver->statistics.variables_original;
925 const unsigned variables_after = solver->active;
927 solver,
928 "[fastel] "
929 "fast elimination of %u variables %.0f%% (%u remain %.0f%%)",
930 eliminated, kissat_percent (eliminated, variables_before),
931 variables_after,
932 kissat_percent (variables_after, original_variables));
933#endif
934 STOP (fastel);
935 REPORT (!eliminated, 'e');
936}
#define all_stack(T, E, S)
Definition stack.h:94
#define SIZE_STACK(S)
Definition stack.h:19
#define EMPTY_STACK(S)
Definition stack.h:18
#define RELEASE_STACK(S)
Definition stack.h:71
#define CLEAR_STACK(S)
Definition stack.h:50
#define PUSH_STACK(S, E)
Definition stack.h:39
#define INIT_STACK(S)
Definition stack.h:22
#define FLAGS
void kissat_enter_dense_mode(kissat *solver, litpairs *irredundant)
Definition dense.c:101
void kissat_resume_sparse_mode(kissat *solver, bool flush_eliminated, litpairs *irredundant)
Definition dense.c:201
void kissat_flush_units_while_connected(kissat *solver)
Definition eliminate.c:162
bool pos
Definition globals.c:30
#define RANK_CANDIDATE(CANDIDATE)
#define all_variables(IDX)
Definition internal.h:269
#define KISSAT_assert(ignore)
Definition global.h:13
#define solver
Definition kitten.c:211
#define GET_OPTION(N)
Definition options.h:295
#define kissat_verbose(...)
Definition print.h:51
#define kissat_extremely_verbose(...)
Definition print.h:53
#define kissat_very_verbose(...)
Definition print.h:52
#define STOP(P)
Definition profile.hpp:158
#define START(P)
Definition profile.hpp:150
#define RADIX_STACK(VTYPE, RTYPE, S, RANK)
Definition rank.h:136
#define REPORT(...)
Definition report.h:10
int lit
Definition satVec.h:130
#define LIT(IDX)
Definition literal.h:31
unsigned pivot
Definition fastel.c:815
Definition flags.h:11
bool eliminate
Definition flags.h:15
bool active
Definition flags.h:12
#define TERMINATED(BIT)
Definition terminate.h:42
#define fastel_terminated_1
Definition terminate.h:63
void kissat_connect_irredundant_large_clauses(kissat *solver)
Definition watch.c:171
Here is the call graph for this function: