ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
kitten.c File Reference
#include "kitten.h"
#include "random.h"
#include "stack.h"
#include <assert.h>
#include <inttypes.h>
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "allocate.h"
#include "error.h"
#include "internal.h"
#include "terminate.h"
Include dependency graph for kitten.c:

Go to the source code of this file.

Classes

struct  kink
 
struct  katch
 
struct  klause
 
struct  kimits
 
struct  kitten
 

Macros

#define KITTEN_TICKS   (solver->statistics_.kitten_ticks)
 
#define INVALID   UINT_MAX
 
#define MAX_VARS   ((1u << 31) - 1)
 
#define CORE_FLAG   (1u)
 
#define LEARNED_FLAG   (2u)
 
#define KITTEN_BLIT
 
#define solver   (kitten->kissat)
 
#define KATCHES(KIT)
 
#define all_klauses(C)
 
#define all_original_klauses(C)
 
#define all_learned_klauses(C)
 
#define all_kits(KIT)
 
#define BEGIN_KLAUSE(C)
 
#define END_KLAUSE(C)
 
#define all_literals_in_klause(KIT, C)
 
#define all_antecedents(REF, C)
 
#define LOG(...)
 
#define ROG(...)
 
#define RESIZE1(T, P)
 
#define RESIZE2(T, P)
 
#define INVALID_API_USAGE(...)
 
#define REQUIRE_INITIALIZED()
 
#define REQUIRE_STATUS(EXPECTED)
 
#define UPDATE_STATUS(STATUS)
 

Typedefs

typedef struct katch katch
 

Functions

typedef STACK (unsigned)
 
kittenkitten_embedded (struct kissat *kissat)
 
void kitten_track_antecedents (kitten *kitten)
 
void kitten_randomize_phases (kitten *kitten)
 
void kitten_flip_phases (kitten *kitten)
 
void kitten_no_ticks_limit (kitten *kitten)
 
void kitten_set_ticks_limit (kitten *kitten, uint64_t delta)
 
void kitten_shuffle_clauses (kitten *kitten)
 
unsigned new_learned_klause (kitten *kitten)
 
void kitten_clear (kitten *kitten)
 
void kitten_release (kitten *kitten)
 
void completely_backtrack_to_root_level (kitten *kitten)
 
void kitten_assume (kitten *kitten, unsigned elit)
 
void kitten_clause_with_id_and_exception (kitten *kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
 
void kitten_clause (kitten *kitten, size_t size, unsigned *elits)
 
void kitten_unit (kitten *kitten, unsigned lit)
 
void kitten_binary (kitten *kitten, unsigned a, unsigned b)
 
int kitten_solve (kitten *kitten)
 
int kitten_status (kitten *kitten)
 
unsigned kitten_compute_clausal_core (kitten *kitten, uint64_t *learned_ptr)
 
void kitten_traverse_core_ids (kitten *kitten, void *state, void(*traverse)(void *, unsigned))
 
void kitten_traverse_core_clauses (kitten *kitten, void *state, void(*traverse)(void *, bool, size_t, const unsigned *))
 
void kitten_shrink_to_clausal_core (kitten *kitten)
 
signed char kitten_value (kitten *kitten, unsigned elit)
 
signed char kitten_fixed (kitten *kitten, unsigned elit)
 
bool kitten_flip_literal (kitten *kitten, unsigned elit)
 
bool kitten_failed (kitten *kitten, unsigned elit)
 

Macro Definition Documentation

◆ all_antecedents

#define all_antecedents ( REF,
C )
Value:
unsigned REF, *REF##_PTR = antecedents_func (C), \
*REF##_END = REF##_PTR + (C)->aux; \
REF##_PTR != REF##_END && ((REF = *REF##_PTR), true); \
++REF##_PTR

Definition at line 346 of file kitten.c.

346#define all_antecedents(REF, C) \
347 unsigned REF, *REF##_PTR = antecedents_func (C), \
348 *REF##_END = REF##_PTR + (C)->aux; \
349 REF##_PTR != REF##_END && ((REF = *REF##_PTR), true); \
350 ++REF##_PTR

◆ all_kits

#define all_kits ( KIT)
Value:
size_t KIT = 0, KIT_##END = kitten->lits; \
KIT != KIT_##END; \
KIT++
size_t lits
Definition kitten.c:232

Definition at line 331 of file kitten.c.

331#define all_kits(KIT) \
332 size_t KIT = 0, KIT_##END = kitten->lits; \
333 KIT != KIT_##END; \
334 KIT++

◆ all_klauses

#define all_klauses ( C)
Value:
klause *C = begin_klauses (kitten), *end_##C = end_klauses (kitten); \
(C) != end_##C; \
(C) = next_klause (kitten, C)

Definition at line 314 of file kitten.c.

314#define all_klauses(C) \
315 klause *C = begin_klauses (kitten), *end_##C = end_klauses (kitten); \
316 (C) != end_##C; \
317 (C) = next_klause (kitten, C)

◆ all_learned_klauses

#define all_learned_klauses ( C)
Value:
klause *C = begin_learned_klauses (kitten), \
*end_##C = end_klauses (kitten); \
(C) != end_##C; \
(C) = next_klause (kitten, C)

Definition at line 325 of file kitten.c.

325#define all_learned_klauses(C) \
326 klause *C = begin_learned_klauses (kitten), \
327 *end_##C = end_klauses (kitten); \
328 (C) != end_##C; \
329 (C) = next_klause (kitten, C)

◆ all_literals_in_klause

#define all_literals_in_klause ( KIT,
C )
Value:
unsigned KIT, *KIT##_PTR = BEGIN_KLAUSE (C), \
*KIT##_END = END_KLAUSE (C); \
KIT##_PTR != KIT##_END && ((KIT = *KIT##_PTR), true); \
++KIT##_PTR
#define END_KLAUSE(C)
#define BEGIN_KLAUSE(C)

Definition at line 340 of file kitten.c.

340#define all_literals_in_klause(KIT, C) \
341 unsigned KIT, *KIT##_PTR = BEGIN_KLAUSE (C), \
342 *KIT##_END = END_KLAUSE (C); \
343 KIT##_PTR != KIT##_END && ((KIT = *KIT##_PTR), true); \
344 ++KIT##_PTR

◆ all_original_klauses

#define all_original_klauses ( C)
Value:
klause *C = begin_klauses (kitten), \
*end_##C = end_original_klauses (kitten); \
(C) != end_##C; \
(C) = next_klause (kitten, C)

Definition at line 319 of file kitten.c.

319#define all_original_klauses(C) \
320 klause *C = begin_klauses (kitten), \
321 *end_##C = end_original_klauses (kitten); \
322 (C) != end_##C; \
323 (C) = next_klause (kitten, C)

◆ BEGIN_KLAUSE

#define BEGIN_KLAUSE ( C)
Value:
(C)->lits

Definition at line 336 of file kitten.c.

◆ CORE_FLAG

#define CORE_FLAG   (1u)

Definition at line 130 of file kitten.c.

◆ END_KLAUSE

#define END_KLAUSE ( C)
Value:
(BEGIN_KLAUSE (C) + (C)->size)

Definition at line 338 of file kitten.c.

◆ INVALID

#define INVALID   UINT_MAX

Definition at line 127 of file kitten.c.

◆ INVALID_API_USAGE

#define INVALID_API_USAGE ( ...)
Value:
invalid_api_usage (__func__, __VA_ARGS__)

Definition at line 626 of file kitten.c.

◆ KATCHES

#define KATCHES ( KIT)
Value:
(kitten->watches[KISSAT_assert ((KIT) < kitten->lits), (KIT)])
#define KISSAT_assert(ignore)
Definition global.h:13
katches * watches
Definition kitten.c:256

Definition at line 312 of file kitten.c.

◆ KITTEN_BLIT

#define KITTEN_BLIT

Definition at line 155 of file kitten.c.

◆ KITTEN_TICKS

#define KITTEN_TICKS   (solver->statistics_.kitten_ticks)

Definition at line 119 of file kitten.c.

◆ LEARNED_FLAG

#define LEARNED_FLAG   (2u)

Definition at line 131 of file kitten.c.

◆ LOG

#define LOG ( ...)
Value:
do { \
} while (0)

Definition at line 422 of file kitten.c.

422#define LOG(...) \
423 do { \
424 } while (0)

◆ MAX_VARS

#define MAX_VARS   ((1u << 31) - 1)

Definition at line 128 of file kitten.c.

◆ REQUIRE_INITIALIZED

#define REQUIRE_INITIALIZED ( )
Value:
do { \
if (!kitten) \
INVALID_API_USAGE ("solver argument zero"); \
} while (0)

Definition at line 628 of file kitten.c.

628#define REQUIRE_INITIALIZED() \
629 do { \
630 if (!kitten) \
631 INVALID_API_USAGE ("solver argument zero"); \
632 } while (0)

◆ REQUIRE_STATUS

#define REQUIRE_STATUS ( EXPECTED)
Value:
do { \
REQUIRE_INITIALIZED (); \
if (kitten->status != (EXPECTED)) \
INVALID_API_USAGE ("invalid status '%s' (expected '%s')", \
status_to_string (kitten->status), \
status_to_string (EXPECTED)); \
} while (0)
int status
Definition kitten.c:216

Definition at line 634 of file kitten.c.

634#define REQUIRE_STATUS(EXPECTED) \
635 do { \
636 REQUIRE_INITIALIZED (); \
637 if (kitten->status != (EXPECTED)) \
638 INVALID_API_USAGE ("invalid status '%s' (expected '%s')", \
639 status_to_string (kitten->status), \
640 status_to_string (EXPECTED)); \
641 } while (0)

◆ RESIZE1

#define RESIZE1 ( T,
P )
Value:
do { \
void *OLD_PTR = (P); \
CALLOC (T, (P), new_size / 2); \
const size_t BYTES = old_vars * sizeof *(P); \
if (BYTES) \
memcpy ((P), OLD_PTR, BYTES); \
void *NEW_PTR = (P); \
(P) = (T*) OLD_PTR; \
DEALLOC ((P), old_size / 2); \
(P) = (T*) NEW_PTR; \
} while (0)

Definition at line 546 of file kitten.c.

546#define RESIZE1(T, P) \
547 do { \
548 void *OLD_PTR = (P); \
549 CALLOC (T, (P), new_size / 2); \
550 const size_t BYTES = old_vars * sizeof *(P); \
551 if (BYTES) \
552 memcpy ((P), OLD_PTR, BYTES); \
553 void *NEW_PTR = (P); \
554 (P) = (T*) OLD_PTR; \
555 DEALLOC ((P), old_size / 2); \
556 (P) = (T*) NEW_PTR; \
557 } while (0)

◆ RESIZE2

#define RESIZE2 ( T,
P )
Value:
do { \
void *OLD_PTR = (P); \
CALLOC (T, (P), new_size); \
const size_t BYTES = old_lits * sizeof *(P); \
if (BYTES) \
memcpy ((P), OLD_PTR, BYTES); \
void *NEW_PTR = (P); \
(P) = (T*) OLD_PTR; \
DEALLOC ((P), old_size); \
(P) = (T*) NEW_PTR; \
} while (0)

Definition at line 559 of file kitten.c.

559#define RESIZE2(T, P) \
560 do { \
561 void *OLD_PTR = (P); \
562 CALLOC (T, (P), new_size); \
563 const size_t BYTES = old_lits * sizeof *(P); \
564 if (BYTES) \
565 memcpy ((P), OLD_PTR, BYTES); \
566 void *NEW_PTR = (P); \
567 (P) = (T*) OLD_PTR; \
568 DEALLOC ((P), old_size); \
569 (P) = (T*) NEW_PTR; \
570 } while (0)

◆ ROG

#define ROG ( ...)
Value:
do { \
} while (0)

Definition at line 425 of file kitten.c.

425#define ROG(...) \
426 do { \
427 } while (0)

◆ solver

#define solver   (kitten->kissat)

Definition at line 211 of file kitten.c.

◆ UPDATE_STATUS

#define UPDATE_STATUS ( STATUS)
Value:
do { \
if (kitten->status != (STATUS)) \
LOG ("updating status from '%s' to '%s'", \
status_to_string (kitten->status), status_to_string (STATUS)); \
else \
LOG ("keeping status at '%s'", status_to_string (STATUS)); \
kitten->status = (STATUS); \
} while (0)

Definition at line 643 of file kitten.c.

643#define UPDATE_STATUS(STATUS) \
644 do { \
645 if (kitten->status != (STATUS)) \
646 LOG ("updating status from '%s' to '%s'", \
647 status_to_string (kitten->status), status_to_string (STATUS)); \
648 else \
649 LOG ("keeping status at '%s'", status_to_string (STATUS)); \
650 kitten->status = (STATUS); \
651 } while (0)

Typedef Documentation

◆ katch

typedef struct katch katch

Definition at line 138 of file kitten.c.

Function Documentation

◆ completely_backtrack_to_root_level()

void completely_backtrack_to_root_level ( kitten * kitten)

Definition at line 1260 of file kitten.c.

1260 {
1261 check_queue (kitten);
1262 LOG ("completely backtracking to level 0");
1263 value *values = kitten->values;
1264 unsigneds *trail = &kitten->trail;
1265#ifndef KISSAT_NDEBUG
1266 kar *vars = kitten->vars;
1267#endif
1268 for (all_stack (unsigned, lit, *trail)) {
1269 KISSAT_assert (vars[lit / 2].level);
1270 unassign (kitten, values, lit);
1271 }
1272 CLEAR_STACK (*trail);
1273 kitten->propagated = 0;
1274 kitten->level = 0;
1275 check_queue (kitten);
1276}
#define all_stack(T, E, S)
Definition stack.h:94
#define CLEAR_STACK(S)
Definition stack.h:50
ABC_NAMESPACE_IMPL_START typedef signed char value
struct kar kar
#define LOG(...)
Definition kitten.c:422
int lit
Definition satVec.h:130
kar * vars
Definition kitten.c:249
unsigned propagated
Definition kitten.c:225
value * values
Definition kitten.c:252
unsigned level
Definition kitten.c:224
unsigneds trail
Definition kitten.c:266
Here is the caller graph for this function:

◆ kitten_assume()

void kitten_assume ( kitten * kitten,
unsigned elit )

Definition at line 1763 of file kitten.c.

1763 {
1765 if (kitten->status)
1766 reset_incremental (kitten);
1767 const unsigned ilit = import_literal (kitten, elit);
1768 LOG ("registering assumption %u", ilit);
1769 PUSH_STACK (kitten->assumptions, ilit);
1770}
#define PUSH_STACK(S, E)
Definition stack.h:39
#define REQUIRE_INITIALIZED()
Definition kitten.c:628
unsigneds assumptions
Definition kitten.c:259

◆ kitten_binary()

void kitten_binary ( kitten * kitten,
unsigned a,
unsigned b )

Definition at line 1809 of file kitten.c.

1809 {
1810 unsigned clause[2] = {a, b};
1812}
void kitten_clause(kitten *kitten, size_t size, unsigned *elits)
Definition kitten.c:1800
Here is the call graph for this function:

◆ kitten_clause()

void kitten_clause ( kitten * kitten,
size_t size,
unsigned * elits )

Definition at line 1800 of file kitten.c.

1800 {
1802 INVALID);
1803}
#define INVALID
void kitten_clause_with_id_and_exception(kitten *kitten, unsigned id, size_t size, const unsigned *elits, unsigned except)
Definition kitten.c:1772
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kitten_clause_with_id_and_exception()

void kitten_clause_with_id_and_exception ( kitten * kitten,
unsigned id,
size_t size,
const unsigned * elits,
unsigned except )

Definition at line 1772 of file kitten.c.

1775 {
1777 if (kitten->status)
1778 reset_incremental (kitten);
1780 const unsigned *const end = elits + size;
1781 for (const unsigned *p = elits; p != end; p++) {
1782 const unsigned elit = *p;
1783 if (elit == except)
1784 continue;
1785 const unsigned ilit = import_literal (kitten, elit);
1786 KISSAT_assert (ilit < kitten->lits);
1787 const unsigned iidx = ilit / 2;
1788 if (kitten->marks[iidx])
1789 INVALID_API_USAGE ("variable '%u' of literal '%u' occurs twice",
1790 elit / 2, elit);
1791 kitten->marks[iidx] = true;
1792 PUSH_STACK (kitten->klause, ilit);
1793 }
1794 for (unsigned *p = kitten->klause.begin; p != kitten->klause.end; p++)
1795 kitten->marks[*p / 2] = false;
1796 new_original_klause (kitten, id);
1798}
#define EMPTY_STACK(S)
Definition stack.h:18
Cube * p
Definition exorList.c:222
#define INVALID_API_USAGE(...)
Definition kitten.c:626
unsigned long long size
Definition giaNewBdd.h:39
unsigneds klause
Definition kitten.c:263
value * marks
Definition kitten.c:251
Here is the caller graph for this function:

◆ kitten_clear()

void kitten_clear ( kitten * kitten)

Definition at line 986 of file kitten.c.

986 {
987 LOG ("clear kitten of size %zu", kitten->size);
988
993
1000
1001 for (all_kits (kit))
1002 CLEAR_STACK (KATCHES (kit));
1003
1004 while (!EMPTY_STACK (kitten->export_))
1006
1007 const size_t lits = kitten->size;
1008 const unsigned vars = lits / 2;
1009
1010#ifndef KISSAT_NDEBUG
1011 for (unsigned i = 0; i < vars; i++)
1012 KISSAT_assert (!kitten->marks[i]);
1013#endif
1014
1015 if (vars) {
1016 memset (kitten->phases, 0, vars);
1017 memset (kitten->vars, 0, vars);
1018 }
1019
1020 if (lits) {
1021 memset (kitten->values, 0, lits);
1022 memset (kitten->failed, 0, lits);
1023 }
1024
1025 clear_kitten (kitten);
1026}
#define POP_STACK(S)
Definition stack.h:37
#define KATCHES(KIT)
#define all_kits(KIT)
unsigned * import
Definition kitten.c:255
unsigneds core
Definition kitten.c:260
unsigneds analyzed
Definition kitten.c:258
unsigneds units
Definition kitten.c:267
unsigneds export_
Definition kitten.c:262
unsigneds eclause
Definition kitten.c:261
bool * failed
Definition kitten.c:253
unsigneds resolved
Definition kitten.c:265
size_t size
Definition kitten.c:246
unsigned char * phases
Definition kitten.c:254
unsigneds klauses
Definition kitten.c:264
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kitten_compute_clausal_core()

unsigned kitten_compute_clausal_core ( kitten * kitten,
uint64_t * learned_ptr )

Definition at line 1872 of file kitten.c.

1873 {
1874 REQUIRE_STATUS (20);
1875
1876 if (!kitten->antecedents)
1877 INVALID_API_USAGE ("antecedents not tracked");
1878
1879 LOG ("computing clausal core");
1880
1881 unsigneds *resolved = &kitten->resolved;
1882 KISSAT_assert (EMPTY_STACK (*resolved));
1883
1884 unsigned original = 0;
1885 uint64_t learned = 0;
1886
1887 unsigned reason_ref = kitten->inconsistent;
1888
1889 if (reason_ref == INVALID) {
1891 reason_ref = kitten->failing;
1892 if (reason_ref == INVALID) {
1893 LOG ("assumptions mutually inconsistent");
1894
1895
1896 // goto DONE;
1897 if (learned_ptr)
1898 *learned_ptr = learned;
1899
1900 LOG ("clausal core of %u original clauses", original);
1901 LOG ("clausal core of %" PRIu64 " learned clauses", learned);
1902#ifdef STAND_ALONE_KITTEN
1903 kitten->statistics.original = original;
1904 kitten->statistics.learned = 0;
1905#endif
1906 UPDATE_STATUS (21);
1907
1908 return original;
1909
1910
1911 }
1912 }
1913
1914 PUSH_STACK (*resolved, reason_ref);
1915 unsigneds *core = &kitten->core;
1916 KISSAT_assert (EMPTY_STACK (*core));
1917
1918 while (!EMPTY_STACK (*resolved)) {
1919 const unsigned c_ref = POP_STACK (*resolved);
1920 if (c_ref == INVALID) {
1921 const unsigned d_ref = POP_STACK (*resolved);
1922 ROG (d_ref, "core[%zu]", SIZE_STACK (*core));
1923 PUSH_STACK (*core, d_ref);
1924 klause *d = dereference_klause (kitten, d_ref);
1925 KISSAT_assert (!is_core_klause (d));
1926 set_core_klause (d);
1927 if (is_learned_klause (d))
1928 learned++;
1929 else
1930 original++;
1931 } else {
1932 klause *c = dereference_klause (kitten, c_ref);
1933 if (is_core_klause (c))
1934 continue;
1935 PUSH_STACK (*resolved, c_ref);
1936 PUSH_STACK (*resolved, INVALID);
1937 ROG (c_ref, "analyzing antecedent core");
1938 if (!is_learned_klause (c))
1939 continue;
1940 for (all_antecedents (d_ref, c)) {
1941 klause *d = dereference_klause (kitten, d_ref);
1942 if (!is_core_klause (d))
1943 PUSH_STACK (*resolved, d_ref);
1944 }
1945 }
1946 }
1947
1948 //DONE:
1949
1950 if (learned_ptr)
1951 *learned_ptr = learned;
1952
1953 LOG ("clausal core of %u original clauses", original);
1954 LOG ("clausal core of %" PRIu64 " learned clauses", learned);
1955#ifdef STAND_ALONE_KITTEN
1956 kitten->statistics.original = original;
1957 kitten->statistics.learned = 0;
1958#endif
1959 UPDATE_STATUS (21);
1960
1961 return original;
1962}
#define SIZE_STACK(S)
Definition stack.h:19
#define all_antecedents(REF, C)
#define ROG(...)
Definition kitten.c:425
#define REQUIRE_STATUS(EXPECTED)
Definition kitten.c:634
#define UPDATE_STATUS(STATUS)
Definition kitten.c:643
unsigned inconsistent
Definition kitten.c:227
unsigned failing
Definition kitten.c:228
bool learned
Definition kitten.c:222
bool antecedents
Definition kitten.c:221
Here is the caller graph for this function:

◆ kitten_embedded()

kitten * kitten_embedded ( struct kissat * kissat)

Definition at line 664 of file kitten.c.

664 {
665 if (!kissat)
666 INVALID_API_USAGE ("'kissat' argument zero");
667
668 kitten *kitten;
669 struct kitten dummy;
670 dummy.kissat = kissat;
671 kitten = &dummy;
672 CALLOC (struct kitten, kitten, 1);
674 initialize_kitten (kitten);
675 return kitten;
676}
#define CALLOC(T, P, N)
struct kissat * kissat
Definition kitten.c:210

◆ kitten_failed()

bool kitten_failed ( kitten * kitten,
unsigned elit )

Definition at line 2137 of file kitten.c.

2137 {
2138 REQUIRE_STATUS (20);
2139 const unsigned eidx = elit / 2;
2140 if (eidx >= kitten->evars)
2141 return false;
2142 unsigned iidx = kitten->import[eidx];
2143 if (!iidx)
2144 return false;
2145 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2146 return kitten->failed[ilit];
2147}
size_t evars
Definition kitten.c:233

◆ kitten_fixed()

signed char kitten_fixed ( kitten * kitten,
unsigned elit )

Definition at line 2107 of file kitten.c.

2107 {
2108 const unsigned eidx = elit / 2;
2109 if (eidx >= kitten->evars)
2110 return 0;
2111 unsigned iidx = kitten->import[eidx];
2112 if (!iidx)
2113 return 0;
2114 iidx--;
2115 const unsigned ilit = 2 * iidx + (elit & 1);
2116 signed char res = kitten->values[ilit];
2117 if (!res)
2118 return 0;
2119 kar *v = kitten->vars + iidx;
2120 if (v->level)
2121 return 0;
2122 return res;
2123}

◆ kitten_flip_literal()

bool kitten_flip_literal ( kitten * kitten,
unsigned elit )

Definition at line 2125 of file kitten.c.

2125 {
2126 REQUIRE_STATUS (10);
2127 const unsigned eidx = elit / 2;
2128 if (eidx >= kitten->evars)
2129 return false;
2130 unsigned iidx = kitten->import[eidx];
2131 if (!iidx)
2132 return false;
2133 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2134 return flip_literal (kitten, ilit);
2135}

◆ kitten_flip_phases()

void kitten_flip_phases ( kitten * kitten)

Definition at line 722 of file kitten.c.

722 {
724
725 LOG ("flipping phases");
726
727 unsigned char *phases = kitten->phases;
728 const unsigned vars = kitten->size / 2;
729
730 unsigned i = 0;
731 const unsigned rest = vars & ~7u;
732
733 while (i != rest) {
734 uint64_t *p = (uint64_t *) (phases + i);
735 *p ^= 0x0101010101010101;
736 i += 8;
737 }
738
739 while (i != vars)
740 phases[i++] ^= 1;
741}

◆ kitten_no_ticks_limit()

void kitten_no_ticks_limit ( kitten * kitten)

Definition at line 743 of file kitten.c.

743 {
745 LOG ("forcing no ticks limit");
746 kitten->limits.ticks = UINT64_MAX;
747}
uint64_t ticks
kimits limits
Definition kitten.c:269

◆ kitten_randomize_phases()

void kitten_randomize_phases ( kitten * kitten)

Definition at line 690 of file kitten.c.

690 {
692
693 LOG ("randomizing phases");
694
695 unsigned char *phases = kitten->phases;
696 const unsigned vars = kitten->size / 2;
697
698 uint64_t random = kissat_next_random64 (&kitten->generator);
699
700 unsigned i = 0;
701 const unsigned rest = vars & ~63u;
702
703 while (i != rest) {
704 uint64_t *p = (uint64_t *) (phases + i);
705 p[0] = (random >> 0) & 0x0101010101010101;
706 p[1] = (random >> 1) & 0x0101010101010101;
707 p[2] = (random >> 2) & 0x0101010101010101;
708 p[3] = (random >> 3) & 0x0101010101010101;
709 p[4] = (random >> 4) & 0x0101010101010101;
710 p[5] = (random >> 5) & 0x0101010101010101;
711 p[6] = (random >> 6) & 0x0101010101010101;
712 p[7] = (random >> 7) & 0x0101010101010101;
713 random = kissat_next_random64 (&kitten->generator);
714 i += 64;
715 }
716
717 unsigned shift = 0;
718 while (i != vars)
719 phases[i++] = (random >> shift++) & 1;
720}
uint64_t generator
Definition kitten.c:230
long random()
Here is the call graph for this function:

◆ kitten_release()

void kitten_release ( kitten * kitten)

Definition at line 1028 of file kitten.c.

1028 {
1039
1040 for (size_t lit = 0; lit < kitten->size; lit++)
1042
1043#ifndef STAND_ALONE_KITTEN
1044 const size_t lits = kitten->size;
1045 const unsigned vars = lits / 2;
1046#endif
1047 DEALLOC (kitten->marks, vars);
1048 DEALLOC (kitten->phases, vars);
1049 DEALLOC (kitten->values, lits);
1050 DEALLOC (kitten->failed, lits);
1051 DEALLOC (kitten->vars, vars);
1052 DEALLOC (kitten->links, vars);
1053 DEALLOC (kitten->watches, lits);
1055#ifdef STAND_ALONE_KITTEN
1056 free (kitten);
1057#else
1058 kissat_free (kitten->kissat, kitten, sizeof *kitten);
1059#endif
1060}
void kissat_free(kissat *solver, void *ptr, size_t bytes)
Definition allocate.c:61
#define RELEASE_STACK(S)
Definition stack.h:71
#define DEALLOC(P, N)
kink * links
Definition kitten.c:250
size_t esize
Definition kitten.c:247
VOID_HACK free()
Here is the call graph for this function:

◆ kitten_set_ticks_limit()

void kitten_set_ticks_limit ( kitten * kitten,
uint64_t delta )

Definition at line 749 of file kitten.c.

749 {
751 const uint64_t current = KITTEN_TICKS;
752 uint64_t limit;
753 if (UINT64_MAX - delta <= current) {
754 LOG ("forcing unlimited ticks limit");
755 limit = UINT64_MAX;
756 } else {
757 limit = current + delta;
758 LOG ("new limit of %" PRIu64 " ticks after %" PRIu64, limit, delta);
759 }
760
761 kitten->limits.ticks = limit;
762}
#define KITTEN_TICKS
Here is the caller graph for this function:

◆ kitten_shrink_to_clausal_core()

void kitten_shrink_to_clausal_core ( kitten * kitten)

Definition at line 2022 of file kitten.c.

2022 {
2023 REQUIRE_STATUS (21);
2024
2025 LOG ("shrinking formula to core of original clauses");
2026
2028
2029 kitten->unassigned = kitten->lits / 2;
2030 kitten->propagated = 0;
2031 kitten->level = 0;
2032
2033 update_search (kitten, kitten->queue.last);
2034
2035 memset (kitten->values, 0, kitten->lits);
2036
2037 for (all_kits (lit))
2039
2041 klause *inconsistent = dereference_klause (kitten, kitten->inconsistent);
2042 if (is_learned_klause (inconsistent) || inconsistent->size) {
2043 ROG (kitten->inconsistent, "resetting inconsistent");
2045 } else
2046 ROG (kitten->inconsistent, "keeping inconsistent");
2047
2049
2050 klause *begin = begin_klauses (kitten), *q = begin;
2051 klause const *const end = end_original_klauses (kitten);
2052#ifdef LOGGING
2053 unsigned original = 0;
2054#endif
2055 for (klause *c = begin, *next; c != end; c = next) {
2056 next = next_klause (kitten, c);
2057 KISSAT_assert (!is_learned_klause (c));
2058 if (is_learned_klause (c))
2059 continue;
2060 if (!is_core_klause (c))
2061 continue;
2062 unset_core_klause (c);
2063 const unsigned dst = (unsigned *) q - (unsigned *) begin;
2064 const unsigned size = c->size;
2065 if (!size) {
2066 if (!kitten->inconsistent)
2067 kitten->inconsistent = dst;
2068 } else if (size == 1)
2069 PUSH_STACK (kitten->units, dst);
2070 else {
2071 watch_klause (kitten, c->lits[0], c, dst);
2072 watch_klause (kitten, c->lits[1], c, dst);
2073 }
2074 if (c == q)
2075 q = next;
2076 else {
2077 const size_t bytes = (char *) next - (char *) c;
2078 memmove (q, c, bytes);
2079 q = (klause *) ((char *) q + bytes);
2080 }
2081#ifdef LOGGING
2082 original++;
2083#endif
2084 }
2085 SET_END_OF_STACK (kitten->klauses, (unsigned *) q);
2087 LOG ("end of original clauses at %zu", kitten->end_original_ref);
2088 LOG ("%u original clauses left", original);
2089
2091
2092 UPDATE_STATUS (0);
2093}
#define SET_END_OF_STACK(S, P)
Definition stack.h:62
struct kitten::@051124040274372165372010377332320121035140324322 queue
unsigned last
Definition kitten.c:238
unsigned unassigned
Definition kitten.c:226
size_t end_original_ref
Definition kitten.c:235
char * memmove()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kitten_shuffle_clauses()

void kitten_shuffle_clauses ( kitten * kitten)

Definition at line 825 of file kitten.c.

825 {
826 REQUIRE_STATUS (0);
827 shuffle_queue (kitten);
828 shuffle_katches (kitten);
829 shuffle_units (kitten);
830}
Here is the caller graph for this function:

◆ kitten_solve()

int kitten_solve ( kitten * kitten)

Definition at line 1818 of file kitten.c.

1818 {
1820 if (kitten->status)
1821 reset_incremental (kitten);
1822 else if (kitten->level)
1824
1825 LOG ("starting solving under %zu assumptions",
1827
1828 INC (kitten_solved);
1829
1830 int res = propagate_units (kitten);
1831 while (!res) {
1832 const unsigned conflict = propagate (kitten);
1833 if (conflict != INVALID) {
1834 if (kitten->level)
1835 analyze (kitten, conflict);
1836 else {
1837 inconsistent (kitten, conflict);
1838 res = 20;
1839 }
1840 } else
1841#ifdef STAND_ALONE_KITTEN
1842 if (time_limit_hit) {
1843 time_limit_hit = false;
1844 break;
1845 } else
1846#endif
1847 res = decide (kitten);
1848 }
1849
1850 if (res < 0)
1851 res = 0;
1852
1853 if (!res && !EMPTY_STACK (kitten->assumptions))
1854 reset_assumptions (kitten);
1855
1856 UPDATE_STATUS (res);
1857
1858 if (res == 10)
1859 INC (kitten_sat);
1860 else if (res == 20)
1861 INC (kitten_unsat);
1862 else
1863 INC (kitten_unknown);
1864
1865 LOG ("finished solving with result %d", res);
1866
1867 return res;
1868}
#define INC(NAME)
void completely_backtrack_to_root_level(kitten *kitten)
Definition kitten.c:1260
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kitten_status()

int kitten_status ( kitten * kitten)

Definition at line 1870 of file kitten.c.

1870{ return kitten->status; }

◆ kitten_track_antecedents()

void kitten_track_antecedents ( kitten * kitten)

Definition at line 680 of file kitten.c.

680 {
681 REQUIRE_STATUS (0);
682
683 if (kitten->learned)
684 INVALID_API_USAGE ("can not start tracking antecedents after learning");
685
686 LOG ("enabling antecedents tracking");
687 kitten->antecedents = true;
688}
Here is the caller graph for this function:

◆ kitten_traverse_core_clauses()

void kitten_traverse_core_clauses ( kitten * kitten,
void * state,
void(* traverse )(void *, bool, size_t, const unsigned *) )

Definition at line 1989 of file kitten.c.

1991 {
1992 REQUIRE_STATUS (21);
1993
1994 LOG ("traversing clausal core");
1995
1996 unsigned traversed = 0;
1997
1998 for (all_stack (unsigned, c_ref, kitten->core)) {
1999 klause *c = dereference_klause (kitten, c_ref);
2000 KISSAT_assert (is_core_klause (c));
2001 const bool learned = is_learned_klause (c);
2002 unsigneds *eclause = &kitten->eclause;
2003 KISSAT_assert (EMPTY_STACK (*eclause));
2004 for (all_literals_in_klause (ilit, c)) {
2005 const unsigned elit = export_literal (kitten, ilit);
2006 PUSH_STACK (*eclause, elit);
2007 }
2008 const size_t size = SIZE_STACK (*eclause);
2009 const unsigned *elits = eclause->begin;
2010 ROG (reference_klause (kitten, c), "traversing");
2011 traverse (state, learned, size, elits);
2012 CLEAR_STACK (*eclause);
2013 traversed++;
2014 }
2015
2016 LOG ("traversed %u core clauses", traversed);
2017 (void) traversed;
2018
2019 KISSAT_assert (kitten->status == 21);
2020}
#define all_literals_in_klause(KIT, C)
Here is the caller graph for this function:

◆ kitten_traverse_core_ids()

void kitten_traverse_core_ids ( kitten * kitten,
void * state,
void(* traverse )(void *, unsigned) )

Definition at line 1964 of file kitten.c.

1965 {
1966 REQUIRE_STATUS (21);
1967
1968 LOG ("traversing core of original clauses");
1969
1970 unsigned traversed = 0;
1971
1972 for (all_original_klauses (c)) {
1973 KISSAT_assert (!is_learned_klause (c));
1974 if (is_learned_klause (c))
1975 continue;
1976 if (!is_core_klause (c))
1977 continue;
1978 ROG (reference_klause (kitten, c), "traversing");
1979 traverse (state, c->aux);
1980 traversed++;
1981 }
1982
1983 LOG ("traversed %u original core clauses", traversed);
1984 (void) traversed;
1985
1986 KISSAT_assert (kitten->status == 21);
1987}
#define all_original_klauses(C)
Here is the caller graph for this function:

◆ kitten_unit()

void kitten_unit ( kitten * kitten,
unsigned lit )

Definition at line 1805 of file kitten.c.

1805 {
1806 kitten_clause (kitten, 1, &lit);
1807}
Here is the call graph for this function:

◆ kitten_value()

signed char kitten_value ( kitten * kitten,
unsigned elit )

Definition at line 2095 of file kitten.c.

2095 {
2096 REQUIRE_STATUS (10);
2097 const unsigned eidx = elit / 2;
2098 if (eidx >= kitten->evars)
2099 return 0;
2100 unsigned iidx = kitten->import[eidx];
2101 if (!iidx)
2102 return 0;
2103 const unsigned ilit = 2 * (iidx - 1) + (elit & 1);
2104 return kitten->values[ilit];
2105}

◆ new_learned_klause()

unsigned new_learned_klause ( kitten * kitten)

Definition at line 962 of file kitten.c.

962 {
963 unsigned res = new_reference (kitten);
964 unsigneds *klauses = &kitten->klauses;
965 const size_t size = SIZE_STACK (kitten->klause);
966 KISSAT_assert (size <= UINT_MAX);
967 const size_t aux =
969 KISSAT_assert (aux <= UINT_MAX);
970 PUSH_STACK (*klauses, (unsigned) aux);
971 PUSH_STACK (*klauses, (unsigned) size);
972 PUSH_STACK (*klauses, LEARNED_FLAG);
973 for (all_stack (unsigned, lit, kitten->klause))
974 PUSH_STACK (*klauses, lit);
975 if (aux)
976 for (all_stack (unsigned, ref, kitten->resolved))
977 PUSH_STACK (*klauses, ref);
978 connect_new_klause (kitten, res);
979 kitten->learned = true;
980#ifdef STAND_ALONE_KITTEN
981 kitten->statistics.learned++;
982#endif
983 return res;
984}
#define LEARNED_FLAG

◆ STACK()

typedef STACK ( unsigned )

Definition at line 139 of file kitten.c.

144 {
145 unsigned level;
146 unsigned reason;
147};