ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
kitten.h File Reference
#include "global.h"
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
Include dependency graph for kitten.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef typedefABC_NAMESPACE_HEADER_START struct cadical_kitten cadical_kitten
 

Functions

cadical_kittencadical_kitten_init (void)
 
void cadical_kitten_clear (cadical_kitten *)
 
void cadical_kitten_release (cadical_kitten *)
 
void cadical_kitten_track_antecedents (cadical_kitten *)
 
void cadical_kitten_shuffle_clauses (cadical_kitten *)
 
void cadical_kitten_flip_phases (cadical_kitten *)
 
void cadical_kitten_randomize_phases (cadical_kitten *)
 
void cadical_kitten_assume (cadical_kitten *, unsigned lit)
 
void cadical_kitten_assume_signed (cadical_kitten *, int lit)
 
void cadical_kitten_clause (cadical_kitten *, size_t size, unsigned *)
 
void citten_clause_with_id (cadical_kitten *, unsigned id, size_t size, int *)
 
void cadical_kitten_unit (cadical_kitten *, unsigned)
 
void cadical_kitten_binary (cadical_kitten *, unsigned, unsigned)
 
void cadical_kitten_clause_with_id_and_exception (cadical_kitten *, unsigned id, size_t size, const unsigned *, unsigned except)
 
void citten_clause_with_id_and_exception (cadical_kitten *, unsigned id, size_t size, const int *, unsigned except)
 
void citten_clause_with_id_and_equivalence (cadical_kitten *, unsigned id, size_t size, const int *, unsigned, unsigned)
 
void cadical_kitten_no_ticks_limit (cadical_kitten *)
 
void cadical_kitten_set_ticks_limit (cadical_kitten *, uint64_t)
 
uint64_t cadical_kitten_current_ticks (cadical_kitten *)
 
void cadical_kitten_no_terminator (cadical_kitten *)
 
void cadical_kitten_set_terminator (cadical_kitten *, void *, int(*)(void *))
 
int cadical_kitten_solve (cadical_kitten *)
 
int cadical_kitten_status (cadical_kitten *)
 
signed char cadical_kitten_value (cadical_kitten *, unsigned)
 
signed char cadical_kitten_signed_value (cadical_kitten *, int)
 
signed char cadical_kitten_fixed (cadical_kitten *, unsigned)
 
signed char cadical_kitten_fixed_signed (cadical_kitten *, int)
 
bool cadical_kitten_failed (cadical_kitten *, unsigned)
 
bool cadical_kitten_flip_literal (cadical_kitten *, unsigned)
 
bool cadical_kitten_flip_signed_literal (cadical_kitten *, int)
 
unsigned cadical_kitten_compute_clausal_core (cadical_kitten *, uint64_t *learned)
 
void cadical_kitten_shrink_to_clausal_core (cadical_kitten *)
 
void cadical_kitten_traverse_core_ids (cadical_kitten *, void *state, void(*traverse)(void *state, unsigned id))
 
void cadical_kitten_traverse_core_clauses (cadical_kitten *, void *state, void(*traverse)(void *state, bool learned, size_t, const unsigned *))
 
void cadical_kitten_traverse_core_clauses_with_id (cadical_kitten *, void *state, void(*traverse)(void *state, unsigned, bool learned, size_t, const unsigned *))
 
void cadical_kitten_trace_core (cadical_kitten *, void *state, void(*trace)(void *, unsigned, unsigned, bool, size_t, const unsigned *, size_t, const unsigned *))
 
int cadical_kitten_compute_prime_implicant (cadical_kitten *cadical_kitten, void *state, bool(*ignore)(void *, unsigned))
 
void cadical_kitten_add_prime_implicant (cadical_kitten *cadical_kitten, void *state, int side, void(*add_implicant)(void *, int, size_t, const unsigned *))
 
int cadical_kitten_flip_and_implicant_for_signed_literal (cadical_kitten *cadical_kitten, int elit)
 

Typedef Documentation

◆ cadical_kitten

typedef typedefABC_NAMESPACE_HEADER_START struct cadical_kitten cadical_kitten

Definition at line 13 of file kitten.h.

Function Documentation

◆ cadical_kitten_add_prime_implicant()

void cadical_kitten_add_prime_implicant ( cadical_kitten * cadical_kitten,
void * state,
int side,
void(* add_implicant )(void *, int, size_t, const unsigned *) )

Definition at line 2350 of file cadical_kitten.c.

2352 {
2353 REQUIRE_STATUS (11);
2354 // might be possible in some edge cases
2355 unsigneds *prime = &cadical_kitten->prime[side];
2356 unsigneds *prime2 = &cadical_kitten->prime[!side];
2357 CADICAL_assert (!EMPTY_STACK (*prime) || !EMPTY_STACK (*prime2));
2358 CLEAR_STACK (*prime2);
2359
2360 for (all_stack (unsigned, lit, *prime)) {
2361 const unsigned not_lit = lit ^ 1;
2362 const unsigned elit = export_literal (cadical_kitten, not_lit);
2363 PUSH_STACK (*prime2, elit);
2364 }
2365
2366 // adds a clause which will reset cadical_kitten status and backtrack
2367 add_implicant (state, side, SIZE_STACK (*prime2), BEGIN_STACK (*prime2));
2368 CLEAR_STACK (*prime);
2369 CLEAR_STACK (*prime2);
2370}
#define CADICAL_assert(ignore)
Definition global.h:14
#define BEGIN_STACK(S)
Definition stack.h:46
#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 CLEAR_STACK(S)
Definition stack.h:50
#define PUSH_STACK(S, E)
Definition stack.h:39
#define REQUIRE_STATUS(EXPECTED)
int lit
Definition satVec.h:130
unsigneds prime[2]

◆ cadical_kitten_assume()

void cadical_kitten_assume ( cadical_kitten * cadical_kitten,
unsigned lit )

Definition at line 1732 of file cadical_kitten.c.

1732 {
1735 reset_incremental (cadical_kitten);
1736 const unsigned ilit = import_literal (cadical_kitten, elit);
1737 LOG ("registering assumption %u", ilit);
1739}
#define REQUIRE_INITIALIZED()
#define LOG(...)
unsigneds assumptions
Here is the caller graph for this function:

◆ cadical_kitten_assume_signed()

void cadical_kitten_assume_signed ( cadical_kitten * cadical_kitten,
int lit )

Definition at line 1741 of file cadical_kitten.c.

1741 {
1742 unsigned kelit = int2u (elit);
1744}
void cadical_kitten_assume(cadical_kitten *cadical_kitten, unsigned elit)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_binary()

void cadical_kitten_binary ( cadical_kitten * cadical_kitten,
unsigned a,
unsigned b )

Definition at line 1848 of file cadical_kitten.c.

1848 {
1849 unsigned clause[2] = {a, b};
1851}
void cadical_kitten_clause(cadical_kitten *cadical_kitten, size_t size, unsigned *elits)
Here is the call graph for this function:

◆ cadical_kitten_clause()

void cadical_kitten_clause ( cadical_kitten * cadical_kitten,
size_t size,
unsigned * elits )

Definition at line 1834 of file cadical_kitten.c.

1834 {
1836 INVALID);
1837}
void cadical_kitten_clause_with_id_and_exception(cadical_kitten *cadical_kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
#define INVALID
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_clause_with_id_and_exception()

void cadical_kitten_clause_with_id_and_exception ( cadical_kitten * cadical_kitten,
unsigned id,
size_t size,
const unsigned * elits,
unsigned except )

Definition at line 1746 of file cadical_kitten.c.

1749 {
1752 reset_incremental (cadical_kitten);
1754 const unsigned *const end = elits + size;
1755 for (const unsigned *p = elits; p != end; p++) {
1756 const unsigned elit = *p;
1757 if (elit == except)
1758 continue;
1759 const unsigned ilit = import_literal (cadical_kitten, elit);
1760 CADICAL_assert (ilit < cadical_kitten->lits);
1761 const unsigned iidx = ilit / 2;
1762 if (cadical_kitten->marks[iidx])
1763 INVALID_API_USAGE ("variable '%u' of literal '%u' occurs twice",
1764 elit / 2, elit);
1765 cadical_kitten->marks[iidx] = true;
1767 }
1768 for (unsigned *p = cadical_kitten->klause.begin; p != cadical_kitten->klause.end; p++)
1769 cadical_kitten->marks[*p / 2] = false;
1770 new_original_klause (cadical_kitten, id);
1772}
#define INVALID_API_USAGE(...)
Cube * p
Definition exorList.c:222
unsigned long long size
Definition giaNewBdd.h:39
Here is the caller graph for this function:

◆ cadical_kitten_clear()

void cadical_kitten_clear ( cadical_kitten * cadical_kitten)

Definition at line 899 of file cadical_kitten.c.

899 {
900 LOG ("clear cadical_kitten of size %zu", cadical_kitten->size);
901
905
915
916 for (all_kits (kit))
917 CLEAR_STACK (KATCHES (kit));
918
921
922 const size_t lits = cadical_kitten->size;
923 const unsigned vars = lits / 2;
924
925#ifndef CADICAL_NDEBUG
926 for (unsigned i = 0; i < vars; i++)
928#endif
929
930 memset (cadical_kitten->phases, 0, vars);
931 memset (cadical_kitten->values, 0, lits);
932 memset (cadical_kitten->failed, 0, lits);
933 memset (cadical_kitten->vars, 0, vars);
934
935 clear_cadical_kitten (cadical_kitten);
936}
#define POP_STACK(S)
Definition stack.h:37
#define KATCHES(KIT)
#define all_kits(KIT)
unsigned char * phases
unsigned * import
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_compute_clausal_core()

unsigned cadical_kitten_compute_clausal_core ( cadical_kitten * cadical_kitten,
uint64_t * learned )

Definition at line 1907 of file cadical_kitten.c.

1908 {
1909 REQUIRE_STATUS (20);
1910
1912 INVALID_API_USAGE ("antecedents not tracked");
1913
1914 LOG ("computing clausal core");
1915
1916 unsigneds *resolved = &cadical_kitten->resolved;
1917 CADICAL_assert (EMPTY_STACK (*resolved));
1918
1919 unsigned original = 0;
1920 uint64_t learned = 0;
1921
1922 unsigned reason_ref = cadical_kitten->inconsistent;
1923
1924 if (reason_ref == INVALID) {
1926 reason_ref = cadical_kitten->failing;
1927 if (reason_ref == INVALID) {
1928 LOG ("assumptions mutually inconsistent");
1929 //goto DONE;
1930 if (learned_ptr)
1931 *learned_ptr = learned;
1932
1933 LOG ("clausal core of %u original clauses", original);
1934 LOG ("clausal core of %" PRIu64 " learned clauses", learned);
1937 UPDATE_STATUS (21);
1938
1939 return original;
1940 }
1941 }
1942
1943 PUSH_STACK (*resolved, reason_ref);
1944 unsigneds *core = &cadical_kitten->core;
1945 CADICAL_assert (EMPTY_STACK (*core));
1946
1947 while (!EMPTY_STACK (*resolved)) {
1948 const unsigned c_ref = POP_STACK (*resolved);
1949 if (c_ref == INVALID) {
1950 const unsigned d_ref = POP_STACK (*resolved);
1951 ROG (d_ref, "core[%zu]", SIZE_STACK (*core));
1952 PUSH_STACK (*core, d_ref);
1953 klause *d = dereference_klause (cadical_kitten, d_ref);
1954 CADICAL_assert (!is_core_klause (d));
1955 set_core_klause (d);
1956 if (is_learned_klause (d))
1957 learned++;
1958 else
1959 original++;
1960 } else {
1961 klause *c = dereference_klause (cadical_kitten, c_ref);
1962 if (is_core_klause (c))
1963 continue;
1964 PUSH_STACK (*resolved, c_ref);
1965 PUSH_STACK (*resolved, INVALID);
1966 ROG (c_ref, "analyzing antecedent core");
1967 if (!is_learned_klause (c))
1968 continue;
1969 for (all_antecedents (d_ref, c)) {
1970 klause *d = dereference_klause (cadical_kitten, d_ref);
1971 if (!is_core_klause (d))
1972 PUSH_STACK (*resolved, d_ref);
1973 }
1974 }
1975 }
1976
1977 //DONE:
1978
1979 if (learned_ptr)
1980 *learned_ptr = learned;
1981
1982 LOG ("clausal core of %u original clauses", original);
1983 LOG ("clausal core of %" PRIu64 " learned clauses", learned);
1986 UPDATE_STATUS (21);
1987
1988 return original;
1989}
#define all_antecedents(REF, C)
#define ROG(...)
#define UPDATE_STATUS(STATUS)
statistics statistics
unsigned inconsistent
uint64_t original
uint64_t learned
Here is the caller graph for this function:

◆ cadical_kitten_compute_prime_implicant()

int cadical_kitten_compute_prime_implicant ( cadical_kitten * cadical_kitten,
void * state,
bool(* ignore )(void *, unsigned) )

Definition at line 2376 of file cadical_kitten.c.

2377 {
2378 REQUIRE_STATUS (10);
2379
2380 value *values = cadical_kitten->values;
2381 kar *vars = cadical_kitten->vars;
2382 unsigneds unassigned;
2383 INIT_STACK (unassigned);
2384 bool limit_hit = 0;
2386 for (int i = 0; i < 2; i++) {
2387 const bool ignoring = i;
2388 for (all_stack (unsigned, lit, cadical_kitten->trail)) {
2390 LOG ("ticks limit %" PRIu64 " hit after %" PRIu64 " ticks",
2392 limit_hit = 1;
2393 break;
2394 }
2395 CADICAL_assert (values[lit] > 0);
2396 const unsigned idx = lit / 2;
2397 const unsigned ref = vars[idx].reason;
2398 CADICAL_assert (vars[idx].level);
2399 klause *c = 0;
2400 if (ref != INVALID)
2401 c = dereference_klause (cadical_kitten, ref);
2402 if (ref == INVALID || is_learned_klause (c) ||
2403 ignore (state, c->aux) == ignoring) {
2404 LOG ("non-prime candidate var %d", idx);
2405 if (prime_propagate (cadical_kitten, idx, state, ignoring, ignore)) {
2406 values[lit] = 0;
2407 values[lit ^ 1] = 0;
2408 PUSH_STACK (unassigned, lit);
2409 } else
2410 CADICAL_assert (values[lit] > 0);
2411 }
2412 }
2413 unsigneds *prime = &cadical_kitten->prime[i];
2414 // push on prime implicant stack.
2415 for (all_kits (lit)) {
2416 if (values[lit] > 0)
2417 PUSH_STACK (*prime, lit);
2418 }
2419 // reassign all literals on
2420 for (all_stack (unsigned, lit, unassigned)) {
2421 CADICAL_assert (!values[lit]);
2422 values[lit] = 1;
2423 values[lit ^ 1] = -1;
2424 }
2425 CLEAR_STACK (unassigned);
2426 }
2427 RELEASE_STACK (unassigned);
2428
2429 if (limit_hit) {
2432 return -1;
2433 }
2434 // the only case when one of the prime implicants is allowed to be empty
2435 // is if ignore returns always true or always false.
2438 UPDATE_STATUS (11);
2439
2441 return res;
2442}
#define RELEASE_STACK(S)
Definition stack.h:71
#define INIT_STACK(S)
Definition stack.h:22
ABC_NAMESPACE_IMPL_START typedef signed char value
#define KITTEN_TICKS
struct kar kar
unsigned short ref
Definition giaNewBdd.h:38
uint64_t ticks
unsigned aux

◆ cadical_kitten_current_ticks()

uint64_t cadical_kitten_current_ticks ( cadical_kitten * cadical_kitten)

Definition at line 686 of file cadical_kitten.c.

686 {
688 const uint64_t current = KITTEN_TICKS;
689 return current;
690}
Here is the caller graph for this function:

◆ cadical_kitten_failed()

bool cadical_kitten_failed ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 2275 of file cadical_kitten.c.

2275 {
2276 REQUIRE_STATUS (20);
2277 const unsigned eidx = elit / 2;
2278 if (eidx >= cadical_kitten->evars)
2279 return false;
2280 unsigned iidx = cadical_kitten->import[eidx];
2281 if (!iidx)
2282 return false;
2283 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2284 return cadical_kitten->failed[ilit];
2285}

◆ cadical_kitten_fixed()

signed char cadical_kitten_fixed ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 2232 of file cadical_kitten.c.

2232 {
2233 const unsigned eidx = elit / 2;
2234 if (eidx >= cadical_kitten->evars)
2235 return 0;
2236 unsigned iidx = cadical_kitten->import[eidx];
2237 if (!iidx)
2238 return 0;
2239 iidx--;
2240 const unsigned ilit = 2 * iidx + (elit & 1);
2241 signed char res = cadical_kitten->values[ilit];
2242 if (!res)
2243 return 0;
2244 kar *v = cadical_kitten->vars + iidx;
2245 if (v->level)
2246 return 0;
2247 return res;
2248}
Here is the caller graph for this function:

◆ cadical_kitten_fixed_signed()

signed char cadical_kitten_fixed_signed ( cadical_kitten * cadical_kitten,
int elit )

Definition at line 2250 of file cadical_kitten.c.

2250 {
2251 unsigned kelit = int2u (elit);
2252 return cadical_kitten_fixed (cadical_kitten, kelit);
2253}
signed char cadical_kitten_fixed(cadical_kitten *cadical_kitten, unsigned elit)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_flip_and_implicant_for_signed_literal()

int cadical_kitten_flip_and_implicant_for_signed_literal ( cadical_kitten * cadical_kitten,
int elit )

Definition at line 2595 of file cadical_kitten.c.

2596 {
2597 REQUIRE_STATUS (10);
2598 unsigned kelit = int2u (elit);
2600 return -2;
2601 }
2602 const unsigned eidx = kelit / 2;
2603 unsigned iidx = cadical_kitten->import[eidx];
2604 CADICAL_assert (iidx);
2605 const unsigned ilit = 2 * (iidx - 1) + (kelit & 1);
2606 return compute_prime_implicant_for (cadical_kitten, ilit);
2607}
bool cadical_kitten_flip_literal(cadical_kitten *cadical_kitten, unsigned elit)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_flip_literal()

bool cadical_kitten_flip_literal ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 2255 of file cadical_kitten.c.

2255 {
2256 REQUIRE_STATUS (10);
2257 const unsigned eidx = elit / 2;
2258 if (eidx >= cadical_kitten->evars)
2259 return false;
2260 unsigned iidx = cadical_kitten->import[eidx];
2261 if (!iidx)
2262 return false;
2263 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2265 return false;
2266 return flip_literal (cadical_kitten, ilit);
2267}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_flip_phases()

void cadical_kitten_flip_phases ( cadical_kitten * cadical_kitten)

Definition at line 659 of file cadical_kitten.c.

659 {
661
662 LOG ("flipping phases");
663
664 unsigned char *phases = cadical_kitten->phases;
665 const unsigned vars = cadical_kitten->size / 2;
666
667 unsigned i = 0;
668 const unsigned rest = vars & ~7u;
669
670 while (i != rest) {
671 uint64_t *p = (uint64_t *) (phases + i);
672 *p ^= 0x0101010101010101;
673 i += 8;
674 }
675
676 while (i != vars)
677 phases[i++] ^= 1;
678}

◆ cadical_kitten_flip_signed_literal()

bool cadical_kitten_flip_signed_literal ( cadical_kitten * cadical_kitten,
int elit )

Definition at line 2269 of file cadical_kitten.c.

2269 {
2270 REQUIRE_STATUS (10);
2271 unsigned kelit = int2u (elit);
2273}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_init()

cadical_kitten * cadical_kitten_init ( void )

Definition at line 606 of file cadical_kitten.c.

606 {
609 initialize_cadical_kitten (cadical_kitten);
610 return cadical_kitten;
611}
#define CALLOC(T, P, N)
Here is the caller graph for this function:

◆ cadical_kitten_no_terminator()

void cadical_kitten_no_terminator ( cadical_kitten * cadical_kitten)

Definition at line 707 of file cadical_kitten.c.

707 {
709 LOG ("removing terminator");
712}
int(* terminator)(void *)

◆ cadical_kitten_no_ticks_limit()

void cadical_kitten_no_ticks_limit ( cadical_kitten * cadical_kitten)

Definition at line 680 of file cadical_kitten.c.

680 {
682 LOG ("forcing no ticks limit");
683 cadical_kitten->limits.ticks = UINT64_MAX;
684}

◆ cadical_kitten_randomize_phases()

void cadical_kitten_randomize_phases ( cadical_kitten * cadical_kitten)

Definition at line 627 of file cadical_kitten.c.

627 {
629
630 LOG ("randomizing phases");
631
632 unsigned char *phases = cadical_kitten->phases;
633 const unsigned vars = cadical_kitten->size / 2;
634
635 uint64_t random = kissat_next_random64 (&cadical_kitten->generator);
636
637 unsigned i = 0;
638 const unsigned rest = vars & ~63u;
639
640 while (i != rest) {
641 uint64_t *p = (uint64_t *) (phases + i);
642 p[0] = (random >> 0) & 0x0101010101010101;
643 p[1] = (random >> 1) & 0x0101010101010101;
644 p[2] = (random >> 2) & 0x0101010101010101;
645 p[3] = (random >> 3) & 0x0101010101010101;
646 p[4] = (random >> 4) & 0x0101010101010101;
647 p[5] = (random >> 5) & 0x0101010101010101;
648 p[6] = (random >> 6) & 0x0101010101010101;
649 p[7] = (random >> 7) & 0x0101010101010101;
650 random = kissat_next_random64 (&cadical_kitten->generator);
651 i += 64;
652 }
653
654 unsigned shift = 0;
655 while (i != vars)
656 phases[i++] = (random >> shift++) & 1;
657}
long random()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_release()

void cadical_kitten_release ( cadical_kitten * cadical_kitten)

Definition at line 938 of file cadical_kitten.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_set_terminator()

void cadical_kitten_set_terminator ( cadical_kitten * cadical_kitten,
void * data,
int(* terminator )(void *) )

Definition at line 714 of file cadical_kitten.c.

715 {
717 LOG ("setting terminator");
718 cadical_kitten->terminator = terminator;
720}
Here is the caller graph for this function:

◆ cadical_kitten_set_ticks_limit()

void cadical_kitten_set_ticks_limit ( cadical_kitten * cadical_kitten,
uint64_t delta )

Definition at line 692 of file cadical_kitten.c.

692 {
694 const uint64_t current = KITTEN_TICKS;
695 uint64_t limit;
696 if (UINT64_MAX - delta <= current) {
697 LOG ("forcing unlimited ticks limit");
698 limit = UINT64_MAX;
699 } else {
700 limit = current + delta;
701 LOG ("new limit of %" PRIu64 " ticks after %" PRIu64, limit, delta);
702 }
703
704 cadical_kitten->limits.ticks = limit;
705}
Here is the caller graph for this function:

◆ cadical_kitten_shrink_to_clausal_core()

void cadical_kitten_shrink_to_clausal_core ( cadical_kitten * cadical_kitten)

Definition at line 2133 of file cadical_kitten.c.

2133 {
2134 REQUIRE_STATUS (21);
2135
2136 LOG ("shrinking formula to core of original clauses");
2137
2139
2142 cadical_kitten->level = 0;
2143
2144 update_search (cadical_kitten, cadical_kitten->queue.last);
2145
2147
2148 for (all_kits (lit))
2150
2152 klause *inconsistent = dereference_klause (cadical_kitten, cadical_kitten->inconsistent);
2153 if (is_learned_klause (inconsistent) || inconsistent->size) {
2154 ROG (cadical_kitten->inconsistent, "resetting inconsistent");
2156 } else
2157 ROG (cadical_kitten->inconsistent, "keeping inconsistent");
2158
2160
2161 klause *begin = begin_klauses (cadical_kitten), *q = begin;
2162 klause const *const end = end_original_klauses (cadical_kitten);
2163#ifdef LOGGING
2164 unsigned original = 0;
2165#endif
2166 for (klause *c = begin, *next; c != end; c = next) {
2167 next = next_klause (cadical_kitten, c);
2168 // CADICAL_assert (!is_learned_klause (c)); not necessarily true
2169 if (is_learned_klause (c))
2170 continue;
2171 if (!is_core_klause (c))
2172 continue;
2173 unset_core_klause (c);
2174 const unsigned dst = (unsigned *) q - (unsigned *) begin;
2175 const unsigned size = c->size;
2176 if (!size) {
2179 } else if (size == 1) {
2181 ROG (dst, "keeping");
2182 } else {
2183 watch_klause (cadical_kitten, c->lits[0], dst);
2184 watch_klause (cadical_kitten, c->lits[1], dst);
2185 }
2186 if (c == q)
2187 q = next;
2188 else {
2189 const size_t bytes = (char *) next - (char *) c;
2190 memmove (q, c, bytes);
2191 q = (klause *) ((char *) q + bytes);
2192 }
2193#ifdef LOGGING
2194 original++;
2195#endif
2196 }
2197 SET_END_OF_STACK (cadical_kitten->klauses, (unsigned *) q);
2199 LOG ("end of original clauses at %zu", cadical_kitten->end_original_ref);
2200 LOG ("%u original clauses left", original);
2201
2203
2204 UPDATE_STATUS (0);
2205}
#define SET_END_OF_STACK(S, P)
Definition stack.h:62
struct cadical_kitten::@204357353010102162247340364316301064170137016325 queue
char * memmove()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_shuffle_clauses()

void cadical_kitten_shuffle_clauses ( cadical_kitten * cadical_kitten)

Definition at line 764 of file cadical_kitten.c.

764 {
765 REQUIRE_STATUS (0);
766 shuffle_queue (cadical_kitten);
767 shuffle_katches (cadical_kitten);
768 shuffle_units (cadical_kitten);
769}
Here is the caller graph for this function:

◆ cadical_kitten_signed_value()

signed char cadical_kitten_signed_value ( cadical_kitten * cadical_kitten,
int selit )

Definition at line 2207 of file cadical_kitten.c.

2207 {
2208 REQUIRE_STATUS (10);
2209 const unsigned elit = int2u (selit);
2210 const unsigned eidx = elit / 2;
2211 if (eidx >= cadical_kitten->evars)
2212 return 0;
2213 unsigned iidx = cadical_kitten->import[eidx];
2214 if (!iidx)
2215 return 0;
2216 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2217 return cadical_kitten->values[ilit];
2218}
Here is the caller graph for this function:

◆ cadical_kitten_solve()

int cadical_kitten_solve ( cadical_kitten * cadical_kitten)

Definition at line 1853 of file cadical_kitten.c.

1853 {
1856 reset_incremental (cadical_kitten);
1857 else // if (cadical_kitten->level)
1859
1860 LOG ("starting solving under %zu assumptions",
1862
1863 INC (cadical_kitten_solved);
1864
1865 int res = propagate_units (cadical_kitten);
1866 while (!res) {
1867 const unsigned conflict = propagate (cadical_kitten);
1870 LOG ("terminator requested termination");
1871 res = -1;
1872 break;
1873 }
1874 if (conflict != INVALID) {
1875 if (cadical_kitten->level)
1876 analyze (cadical_kitten, conflict);
1877 else {
1878 inconsistent (cadical_kitten, conflict);
1879 res = 20;
1880 }
1881 } else
1882 res = decide (cadical_kitten);
1883 }
1884
1885 if (res < 0)
1886 res = 0;
1887
1888 if (!res && !EMPTY_STACK (cadical_kitten->assumptions))
1889 reset_assumptions (cadical_kitten);
1890
1891 UPDATE_STATUS (res);
1892
1893 if (res == 10)
1894 INC (cadical_kitten_sat);
1895 else if (res == 20)
1896 INC (cadical_kitten_unsat);
1897 else
1898 INC (cadical_kitten_unknown);
1899
1900 LOG ("finished solving with result %d", res);
1901
1902 return res;
1903}
#define INC(NAME)
void cadical_completely_backtrack_to_root_level(cadical_kitten *cadical_kitten)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cadical_kitten_status()

int cadical_kitten_status ( cadical_kitten * cadical_kitten)

Definition at line 1905 of file cadical_kitten.c.

1905{ return cadical_kitten->status; }
Here is the caller graph for this function:

◆ cadical_kitten_trace_core()

void cadical_kitten_trace_core ( cadical_kitten * cadical_kitten,
void * state,
void(* trace )(void *, unsigned, unsigned, bool, size_t, const unsigned *, size_t, const unsigned *) )

Definition at line 2085 of file cadical_kitten.c.

2088 {
2089 REQUIRE_STATUS (21);
2090
2091 LOG ("tracing clausal core");
2092
2093 unsigned traced = 0;
2094
2095 for (all_stack (unsigned, c_ref, cadical_kitten->core)) {
2096 klause *c = dereference_klause (cadical_kitten, c_ref);
2097 CADICAL_assert (is_core_klause (c));
2098 const bool learned = is_learned_klause (c);
2099 unsigneds *eclause = &cadical_kitten->eclause;
2100 CADICAL_assert (EMPTY_STACK (*eclause));
2101 for (all_literals_in_klause (ilit, c)) {
2102 const unsigned elit = export_literal (cadical_kitten, ilit);
2103 PUSH_STACK (*eclause, elit);
2104 }
2105 const size_t size = SIZE_STACK (*eclause);
2106 const unsigned *elits = eclause->begin;
2107
2108 unsigneds *resolved = &cadical_kitten->resolved;
2109 CADICAL_assert (EMPTY_STACK (*resolved));
2110 if (learned) {
2111 for (all_antecedents (ref, c)) {
2112 PUSH_STACK (*resolved, ref);
2113 }
2114 }
2115 const size_t rsize = SIZE_STACK (*resolved);
2116 const unsigned *rids = resolved->begin;
2117
2118 unsigned cid = reference_klause (cadical_kitten, c);
2119 unsigned ctag = learned ? 0 : c->aux;
2120 ROG (cid, "tracing");
2121 trace (state, cid, ctag, learned, size, elits, rsize, rids);
2122 CLEAR_STACK (*eclause);
2123 CLEAR_STACK (*resolved);
2124 traced++;
2125 }
2126
2127 LOG ("traced %u core clauses", traced);
2128 (void) traced;
2129
2131}
#define all_literals_in_klause(KIT, C)
bool trace
Definition globals.c:36
Here is the caller graph for this function:

◆ cadical_kitten_track_antecedents()

void cadical_kitten_track_antecedents ( cadical_kitten * cadical_kitten)

Definition at line 617 of file cadical_kitten.c.

617 {
618 REQUIRE_STATUS (0);
619
621 INVALID_API_USAGE ("can not start tracking antecedents after learning");
622
623 LOG ("enabling antecedents tracking");
625}
Here is the caller graph for this function:

◆ cadical_kitten_traverse_core_clauses()

void cadical_kitten_traverse_core_clauses ( cadical_kitten * cadical_kitten,
void * state,
void(* traverse )(void *state, bool learned, size_t, const unsigned *) )

Definition at line 2017 of file cadical_kitten.c.

2019 {
2020 REQUIRE_STATUS (21);
2021
2022 LOG ("traversing clausal core");
2023
2024 unsigned traversed = 0;
2025
2026 for (all_stack (unsigned, c_ref, cadical_kitten->core)) {
2027 klause *c = dereference_klause (cadical_kitten, c_ref);
2028 CADICAL_assert (is_core_klause (c));
2029 const bool learned = is_learned_klause (c);
2030 unsigneds *eclause = &cadical_kitten->eclause;
2031 CADICAL_assert (EMPTY_STACK (*eclause));
2032 for (all_literals_in_klause (ilit, c)) {
2033 const unsigned elit = export_literal (cadical_kitten, ilit);
2034 PUSH_STACK (*eclause, elit);
2035 }
2036 const size_t size = SIZE_STACK (*eclause);
2037 const unsigned *elits = eclause->begin;
2038 ROG (reference_klause (cadical_kitten, c), "traversing");
2039 traverse (state, learned, size, elits);
2040 CLEAR_STACK (*eclause);
2041 traversed++;
2042 }
2043
2044 LOG ("traversed %u core clauses", traversed);
2045 (void) traversed;
2046
2048}
Here is the caller graph for this function:

◆ cadical_kitten_traverse_core_clauses_with_id()

void cadical_kitten_traverse_core_clauses_with_id ( cadical_kitten * cadical_kitten,
void * state,
void(* traverse )(void *state, unsigned, bool learned, size_t, const unsigned *) )

Definition at line 2050 of file cadical_kitten.c.

2053 {
2054 REQUIRE_STATUS (21);
2055
2056 LOG ("traversing clausal core");
2057
2058 unsigned traversed = 0;
2059
2060 for (all_stack (unsigned, c_ref, cadical_kitten->core)) {
2061 klause *c = dereference_klause (cadical_kitten, c_ref);
2062 CADICAL_assert (is_core_klause (c));
2063 const bool learned = is_learned_klause (c);
2064 unsigneds *eclause = &cadical_kitten->eclause;
2065 CADICAL_assert (EMPTY_STACK (*eclause));
2066 for (all_literals_in_klause (ilit, c)) {
2067 const unsigned elit = export_literal (cadical_kitten, ilit);
2068 PUSH_STACK (*eclause, elit);
2069 }
2070 const size_t size = SIZE_STACK (*eclause);
2071 const unsigned *elits = eclause->begin;
2072 ROG (reference_klause (cadical_kitten, c), "traversing");
2073 unsigned ctag = learned ? 0 : c->aux;
2074 traverse (state, ctag, learned, size, elits);
2075 CLEAR_STACK (*eclause);
2076 traversed++;
2077 }
2078
2079 LOG ("traversed %u core clauses", traversed);
2080 (void) traversed;
2081
2083}
Here is the caller graph for this function:

◆ cadical_kitten_traverse_core_ids()

void cadical_kitten_traverse_core_ids ( cadical_kitten * cadical_kitten,
void * state,
void(* traverse )(void *state, unsigned id) )

Definition at line 1991 of file cadical_kitten.c.

1992 {
1993 REQUIRE_STATUS (21);
1994
1995 LOG ("traversing core of original clauses");
1996
1997 unsigned traversed = 0;
1998
1999 for (all_original_klauses (c)) {
2000 // only happens for 'true' incremental calls, i.e. if add happens after
2001 // solve
2002 if (is_learned_klause (c))
2003 continue;
2004 if (!is_core_klause (c))
2005 continue;
2006 ROG (reference_klause (cadical_kitten, c), "traversing");
2007 traverse (state, c->aux);
2008 traversed++;
2009 }
2010
2011 LOG ("traversed %u original core clauses", traversed);
2012 (void) traversed;
2013
2015}
#define all_original_klauses(C)
Here is the caller graph for this function:

◆ cadical_kitten_unit()

void cadical_kitten_unit ( cadical_kitten * cadical_kitten,
unsigned lit )

Definition at line 1844 of file cadical_kitten.c.

1844 {
1846}
Here is the call graph for this function:

◆ cadical_kitten_value()

signed char cadical_kitten_value ( cadical_kitten * cadical_kitten,
unsigned elit )

Definition at line 2220 of file cadical_kitten.c.

2220 {
2221 REQUIRE_STATUS (10);
2222 const unsigned eidx = elit / 2;
2223 if (eidx >= cadical_kitten->evars)
2224 return 0;
2225 unsigned iidx = cadical_kitten->import[eidx];
2226 if (!iidx)
2227 return 0;
2228 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2229 return cadical_kitten->values[ilit];
2230}

◆ citten_clause_with_id()

void citten_clause_with_id ( cadical_kitten * cadical_kitten,
unsigned id,
size_t size,
int * elits )

Definition at line 1839 of file cadical_kitten.c.

1840 {
1842}
void citten_clause_with_id_and_exception(cadical_kitten *cadical_kitten, unsigned id, size_t size, const int *elits, unsigned except)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ citten_clause_with_id_and_equivalence()

void citten_clause_with_id_and_equivalence ( cadical_kitten * cadical_kitten,
unsigned id,
size_t size,
const int * elits,
unsigned lit,
unsigned other )

Definition at line 1801 of file cadical_kitten.c.

1803 {
1806 reset_incremental (cadical_kitten);
1808 bool sat = false;
1809 const int *const end = elits + size;
1810 for (const int *p = elits; p != end; p++) {
1811 const unsigned elit = int2u (*p); // this is the conversion
1812 if (elit == (lit ^ 1u) || elit == (other ^ 1u))
1813 continue;
1814 if (elit == lit || elit == other) {
1815 sat = true;
1816 break;
1817 }
1818 const unsigned ilit = import_literal (cadical_kitten, elit);
1819 CADICAL_assert (ilit < cadical_kitten->lits);
1820 const unsigned iidx = ilit / 2;
1821 if (cadical_kitten->marks[iidx])
1822 INVALID_API_USAGE ("variable '%u' of literal '%u' occurs twice",
1823 elit / 2, elit);
1824 cadical_kitten->marks[iidx] = true;
1826 }
1827 for (unsigned *p = cadical_kitten->klause.begin; p != cadical_kitten->klause.end; p++)
1828 cadical_kitten->marks[*p / 2] = false;
1829 if (!sat)
1830 new_original_klause (cadical_kitten, id);
1832}

◆ citten_clause_with_id_and_exception()

void citten_clause_with_id_and_exception ( cadical_kitten * cadical_kitten,
unsigned id,
size_t size,
const int * elits,
unsigned except )

Definition at line 1774 of file cadical_kitten.c.

1776 {
1779 reset_incremental (cadical_kitten);
1781 const int *const end = elits + size;
1782 for (const int *p = elits; p != end; p++) {
1783 const unsigned elit = int2u (*p); // this is the conversion
1784 if (elit == except)
1785 continue;
1786 const unsigned ilit = import_literal (cadical_kitten, elit);
1787 CADICAL_assert (ilit < cadical_kitten->lits);
1788 const unsigned iidx = ilit / 2;
1789 if (cadical_kitten->marks[iidx])
1790 INVALID_API_USAGE ("variable '%u' of literal '%u' occurs twice",
1791 elit / 2, elit);
1792 cadical_kitten->marks[iidx] = true;
1794 }
1795 for (unsigned *p = cadical_kitten->klause.begin; p != cadical_kitten->klause.end; p++)
1796 cadical_kitten->marks[*p / 2] = false;
1797 new_original_klause (cadical_kitten, id);
1799}
Here is the caller graph for this function: