• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SRI-CSL / yices2 / 26150511973

20 May 2026 08:06AM UTC coverage: 67.598% (+0.1%) from 67.453%
26150511973

Pull #611

github

disteph
Merge branch 'master' into mcsat-supplement-cdclt
Pull Request #611: Wrap MCSAT as a Nelson-Oppen theory solver in CDCL(T) architecture

682 of 994 new or added lines in 15 files covered. (68.61%)

2 existing lines in 2 files now uncovered.

86598 of 128107 relevant lines covered (67.6%)

1614128.85 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

27.18
/src/api/search_parameters.c
1
/*
2
 * This file is part of the Yices SMT Solver.
3
 * Copyright (C) 2017 SRI International.
4
 *
5
 * Yices is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation, either version 3 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * Yices is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with Yices.  If not, see <http://www.gnu.org/licenses/>.
17
 */
18

19
/*
20
 * THE SEARCH PARAMETERS/OPTIONS USED BY THE SOLVER
21
 */
22

23
#include <float.h>
24
#include <assert.h>
25

26
#include "api/search_parameters.h"
27
#include "solvers/funs/fun_solver.h"
28
#include "solvers/simplex/simplex.h"
29
#include "solvers/quant/quant_solver.h"
30
#include "utils/string_utils.h"
31

32

33

34
/*******************************
35
 *  DEFAULT SEARCH PARAMETERS  *
36
 ******************************/
37

38
/*
39
 * Default restart parameters for SMT solving
40
 * Minisat-like behavior
41
 */
42
#define DEFAULT_FAST_RESTART false
43
#define DEFAULT_C_THRESHOLD  100
44
#define DEFAULT_D_THRESHOLD  100
45
#define DEFAULT_C_FACTOR     1.5
46
#define DEFAULT_D_FACTOR     1.5
47

48
/*
49
 * Restart parameters if option --fast-restarts is set
50
 */
51
#define FAST_RESTART_C_THRESHOLD 100
52
#define FAST_RESTART_D_THRESHOLD 100
53
#define FAST_RESTART_C_FACTOR    1.1
54
#define FAST_RESTART_D_FACTOR    1.1
55

56
/*
57
 * Default clause deletion parameters
58
 */
59
#define DEFAULT_R_THRESHOLD   1000
60
#define DEFAULT_R_FRACTION    0.25
61
#define DEFAULT_R_FACTOR      1.05
62

63

64
/*
65
 * The default SMT parameters are copied from smt_core.h
66
 * - VAR_DECAY_FACTOR  = 0.95
67
 * - VAR_RANDOM_FACTOR = 0.02
68
 * - CLAUSE_DECAY_FACTOR = 0.999
69
 * - clause caching is disabled
70
 */
71
#define DEFAULT_VAR_DECAY      VAR_DECAY_FACTOR
72
#define DEFAULT_RANDOMNESS     VAR_RANDOM_FACTOR
73
#define DEFAULT_CLAUSE_DECAY   CLAUSE_DECAY_FACTOR
74
#define DEFAULT_CACHE_TCLAUSES false
75
#define DEFAULT_TCLAUSE_SIZE   0
76

77

78
/*
79
 * Default random seed as in smt_core.d
80
 */
81
#define DEFAULT_RANDOM_SEED    0xabcdef98
82

83
/*
84
 * Default branching = the smt_core default
85
 */
86
#define DEFAULT_BRANCHING  BRANCHING_DEFAULT
87
#define DEFAULT_SAT_DELEGATE SAT_DELEGATE_NONE
88

89
/*
90
 * The default EGRAPH parameters are defined in egraph_types.h
91
 * - DEFAULT_MAX_ACKERMANN = 1000
92
 * - DEFAULT_MAX_BOOLACKERMANN = 600000
93
 * - DEFAULT_AUX_EQ_QUOTA = 100
94
 * - DEFAULT_ACKERMANN_THRESHOLD = 8
95
 * - DEFAULT_BOOLACK_THRESHOLD = 8
96
 * - DEFAULT_MAX_INTERFACE_EQS = 200
97
 *
98
 * The dynamic ackermann heuristic is disabled for both
99
 * boolean and non-boolean terms.
100
 */
101
#define DEFAULT_USE_DYN_ACK           false
102
#define DEFAULT_USE_BOOL_DYN_ACK      false
103
#define DEFAULT_USE_OPTIMISTIC_FCHECK true
104
#define DEFAULT_AUX_EQ_RATIO          0.3
105
#define DEFAULT_MCSAT_SUPPLEMENT_CHECK MCSAT_SUPPLEMENT_CHECK_BOTH
106

107

108
/*
109
 * Default SIMPLEX parameters defined in simplex_types.h
110
 * - SIMPLEX_DEFAULT_BLAND_THRESHOLD = 1000
111
 * - SIMPLEX_DEFAULT_PROP_ROW_SIZE = 30
112
 * - SIMPLEX_DEFAULT_CHECK_PERIOD = infinity
113
 * - propagation is disabled by default
114
 * - model adjustment is also disabled
115
 * - integer check is disabled too
116
 */
117
#define DEFAULT_SIMPLEX_PROP_FLAG     false
118
#define DEFAULT_SIMPLEX_ADJUST_FLAG   false
119
#define DEFAULT_SIMPLEX_ICHECK_FLAG   false
120

121
/*
122
 * Default parameters for the array solver (defined in fun_solver.h
123
 * - MAX_UPDATE_CONFLICTS = 20
124
 * - MAX_EXTENSIONALITY = 1
125
 */
126

127

128
/*
129
 * All default parameters
130
 */
131
static const param_t default_settings = {
132
  DEFAULT_FAST_RESTART,
133
  DEFAULT_C_THRESHOLD,
134
  DEFAULT_D_THRESHOLD,
135
  DEFAULT_C_FACTOR,
136
  DEFAULT_D_FACTOR,
137

138
  DEFAULT_R_THRESHOLD,
139
  DEFAULT_R_FRACTION,
140
  DEFAULT_R_FACTOR,
141

142
  DEFAULT_VAR_DECAY,
143
  DEFAULT_RANDOMNESS,
144
  DEFAULT_RANDOM_SEED,
145
  DEFAULT_BRANCHING,
146
  DEFAULT_CLAUSE_DECAY,
147
  DEFAULT_CACHE_TCLAUSES,
148
  DEFAULT_TCLAUSE_SIZE,
149
  DEFAULT_SAT_DELEGATE,
150

151
  DEFAULT_USE_DYN_ACK,
152
  DEFAULT_USE_BOOL_DYN_ACK,
153
  DEFAULT_USE_OPTIMISTIC_FCHECK,
154
  DEFAULT_MAX_ACKERMANN,
155
  DEFAULT_MAX_BOOLACKERMANN,
156
  DEFAULT_AUX_EQ_QUOTA,
157
  DEFAULT_AUX_EQ_RATIO,
158
  DEFAULT_ACKERMANN_THRESHOLD,
159
  DEFAULT_BOOLACK_THRESHOLD,
160
  DEFAULT_MAX_INTERFACE_EQS,
161

162
  DEFAULT_SIMPLEX_PROP_FLAG,
163
  DEFAULT_SIMPLEX_ADJUST_FLAG,
164
  DEFAULT_SIMPLEX_ICHECK_FLAG,
165
  SIMPLEX_DEFAULT_PROP_ROW_SIZE,
166
  SIMPLEX_DEFAULT_BLAND_THRESHOLD,
167
  SIMPLEX_DEFAULT_CHECK_PERIOD,
168

169
  DEFAULT_MAX_UPDATE_CONFLICTS,
170
  DEFAULT_MAX_EXTENSIONALITY,
171
  DEFAULT_MCSAT_SUPPLEMENT_CHECK,
172
};
173

174

175

176
/*************************************
177
 *  GLOBAL TABLES: PARAMETER NAMES   *
178
 ************************************/
179

180
/*
181
 * Search parameters and options can be set individually.
182
 *
183
 * We use an integer code to identify the parameters + a table of
184
 * parameter names in lexicographic order. Each parameter
185
 * is described in context.h
186
 */
187
typedef enum param_key {
188
  // restart parameters
189
  PARAM_FAST_RESTART,
190
  PARAM_C_THRESHOLD,
191
  PARAM_D_THRESHOLD,
192
  PARAM_C_FACTOR,
193
  PARAM_D_FACTOR,
194
  PARAM_DELEGATE,
195
  // clause deletion heuristic
196
  PARAM_R_THRESHOLD,
197
  PARAM_R_FRACTION,
198
  PARAM_R_FACTOR,
199
  // branching heuristic
200
  PARAM_VAR_DECAY,
201
  PARAM_RANDOMNESS,
202
  PARAM_RANDOM_SEED,
203
  PARAM_BRANCHING,
204
  // learned clauses
205
  PARAM_CLAUSE_DECAY,
206
  PARAM_CACHE_TCLAUSES,
207
  PARAM_TCLAUSE_SIZE,
208
  // egraph parameters
209
  PARAM_DYN_ACK,
210
  PARAM_DYN_BOOL_ACK,
211
  PARAM_OPTIMISTIC_FCHECK,
212
  PARAM_MAX_ACK,
213
  PARAM_MAX_BOOL_ACK,
214
  PARAM_AUX_EQ_QUOTA,
215
  PARAM_AUX_EQ_RATIO,
216
  PARAM_DYN_ACK_THRESHOLD,
217
  PARAM_DYN_BOOL_ACK_THRESHOLD,
218
  PARAM_MAX_INTERFACE_EQS,
219
  // simplex parameters
220
  PARAM_SIMPLEX_PROP,
221
  PARAM_SIMPLEX_ADJUST,
222
  PARAM_SIMPLEX_ICHECK,
223
  PARAM_PROP_THRESHOLD,
224
  PARAM_BLAND_THRESHOLD,
225
  PARAM_ICHECK_PERIOD,
226
  // array solver
227
  PARAM_MAX_UPDATE_CONFLICTS,
228
  PARAM_MAX_EXTENSIONALITY,
229
  PARAM_MCSAT_SUPPLEMENT_CHECK,
230
} param_key_t;
231

232
#define NUM_PARAM_KEYS (PARAM_MCSAT_SUPPLEMENT_CHECK+1)
233

234
// parameter names in lexicographic ordering
235
static const char *const param_key_names[NUM_PARAM_KEYS] = {
236
  "aux-eq-quota",
237
  "aux-eq-ratio",
238
  "bland-threshold",
239
  "branching",
240
  "c-factor",
241
  "c-threshold",
242
  "cache-tclauses",
243
  "clause-decay",
244
  "d-factor",
245
  "d-threshold",
246
  "delegate",
247
  "dyn-ack",
248
  "dyn-ack-threshold",
249
  "dyn-bool-ack",
250
  "dyn-bool-ack-threshold",
251
  "fast-restarts",
252
  "icheck",
253
  "icheck-period",
254
  "max-ack",
255
  "max-bool-ack",
256
  "max-extensionality",
257
  "max-interface-eqs",
258
  "max-update-conflicts",
259
  "mcsat-supplement-check",
260
  "optimistic-final-check",
261
  "prop-threshold",
262
  "r-factor",
263
  "r-fraction",
264
  "r-threshold",
265
  "random-seed",
266
  "randomness",
267
  "simplex-adjust",
268
  "simplex-prop",
269
  "tclause-size",
270
  "var-decay",
271
};
272

273
// corresponding parameter codes in order
274
static const int32_t param_code[NUM_PARAM_KEYS] = {
275
  PARAM_AUX_EQ_QUOTA,
276
  PARAM_AUX_EQ_RATIO,
277
  PARAM_BLAND_THRESHOLD,
278
  PARAM_BRANCHING,
279
  PARAM_C_FACTOR,
280
  PARAM_C_THRESHOLD,
281
  PARAM_CACHE_TCLAUSES,
282
  PARAM_CLAUSE_DECAY,
283
  PARAM_D_FACTOR,
284
  PARAM_D_THRESHOLD,
285
  PARAM_DELEGATE,
286
  PARAM_DYN_ACK,
287
  PARAM_DYN_ACK_THRESHOLD,
288
  PARAM_DYN_BOOL_ACK,
289
  PARAM_DYN_BOOL_ACK_THRESHOLD,
290
  PARAM_FAST_RESTART,
291
  PARAM_SIMPLEX_ICHECK,
292
  PARAM_ICHECK_PERIOD,
293
  PARAM_MAX_ACK,
294
  PARAM_MAX_BOOL_ACK,
295
  PARAM_MAX_EXTENSIONALITY,
296
  PARAM_MAX_INTERFACE_EQS,
297
  PARAM_MAX_UPDATE_CONFLICTS,
298
  PARAM_MCSAT_SUPPLEMENT_CHECK,
299
  PARAM_OPTIMISTIC_FCHECK,
300
  PARAM_PROP_THRESHOLD,
301
  PARAM_R_FACTOR,
302
  PARAM_R_FRACTION,
303
  PARAM_R_THRESHOLD,
304
  PARAM_RANDOM_SEED,
305
  PARAM_RANDOMNESS,
306
  PARAM_SIMPLEX_ADJUST,
307
  PARAM_SIMPLEX_PROP,
308
  PARAM_TCLAUSE_SIZE,
309
  PARAM_VAR_DECAY,
310
};
311

312

313

314
/*
315
 * Names of each branching mode (in lexicographic order)
316
 */
317
static const char * const branching_modes[NUM_BRANCHING_MODES] = {
318
  "default",
319
  "negative",
320
  "positive",
321
  "th-neg",
322
  "th-pos",
323
  "theory",
324
};
325

326
static const int32_t branching_code[NUM_BRANCHING_MODES] = {
327
  BRANCHING_DEFAULT,
328
  BRANCHING_NEGATIVE,
329
  BRANCHING_POSITIVE,
330
  BRANCHING_TH_NEG,
331
  BRANCHING_TH_POS,
332
  BRANCHING_THEORY,
333
};
334

335
/*
336
 * Supplementary MCSAT checking modes (in lexicographic order)
337
 */
338
static const char * const mcsat_supplement_check_modes[NUM_MCSAT_SUPPLEMENT_CHECK_MODES] = {
339
  "both",
340
  "final-only",
341
};
342

343
static const int32_t mcsat_supplement_check_code[NUM_MCSAT_SUPPLEMENT_CHECK_MODES] = {
344
  MCSAT_SUPPLEMENT_CHECK_BOTH,
345
  MCSAT_SUPPLEMENT_CHECK_FINAL_ONLY,
346
};
347

348
/*
349
 * Names of delegate solvers (in lexicographic order)
350
 */
351
static const char * const sat_delegate_modes[NUM_SAT_DELEGATES] = {
352
  "cadical",
353
  "cryptominisat",
354
  "kissat",
355
  "none",
356
  "y2sat",
357
};
358

359
static const int32_t sat_delegate_code[NUM_SAT_DELEGATES] = {
360
  SAT_DELEGATE_CADICAL,
361
  SAT_DELEGATE_CRYPTOMINISAT,
362
  SAT_DELEGATE_KISSAT,
363
  SAT_DELEGATE_NONE,
364
  SAT_DELEGATE_Y2SAT,
365
};
366

367
static const char * const sat_delegate_incremental_mode_names[NUM_SAT_DELEGATE_INCREMENTAL_MODES] = {
368
  "append",
369
  "rebuild",
370
  "selector-frames",
371
};
372

373
static const int32_t sat_delegate_incremental_mode_code[NUM_SAT_DELEGATE_INCREMENTAL_MODES] = {
374
  SAT_DELEGATE_MODE_APPEND,
375
  SAT_DELEGATE_MODE_REBUILD,
376
  SAT_DELEGATE_MODE_SELECTOR_FRAMES,
377
};
378

379
const char *sat_delegate_name(sat_delegate_t mode) {
2,792✔
380
  switch (mode) {
2,792✔
381
  case SAT_DELEGATE_Y2SAT:
28✔
382
    return "y2sat";
28✔
383
  case SAT_DELEGATE_CADICAL:
66✔
384
    return "cadical";
66✔
385
  case SAT_DELEGATE_CRYPTOMINISAT:
×
386
    return "cryptominisat";
×
387
  case SAT_DELEGATE_KISSAT:
×
388
    return "kissat";
×
389
  case SAT_DELEGATE_NONE:
2,698✔
390
  default:
391
    return NULL;
2,698✔
392
  }
393
}
394

395
int32_t parse_sat_delegate(const char *value, sat_delegate_t *v) {
62✔
396
  int32_t k;
397

398
  k = parse_as_keyword(value, sat_delegate_modes, sat_delegate_code, NUM_SAT_DELEGATES);
62✔
399
  assert(k >= 0 || k == -1);
400

401
  if (k >= 0) {
62✔
402
    assert(SAT_DELEGATE_NONE <= k && k <= SAT_DELEGATE_KISSAT);
403
    *v = (sat_delegate_t) k;
61✔
404
    return 0;
61✔
405
  }
406

407
  return -2;
1✔
408
}
409

410
const char *sat_delegate_incremental_mode_name(sat_delegate_incremental_mode_t mode) {
×
411
  switch (mode) {
×
412
  case SAT_DELEGATE_MODE_REBUILD:
×
413
    return "rebuild";
×
414
  case SAT_DELEGATE_MODE_APPEND:
×
415
    return "append";
×
416
  case SAT_DELEGATE_MODE_SELECTOR_FRAMES:
×
417
    return "selector-frames";
×
418
  default:
×
419
    return NULL;
×
420
  }
421
}
422

423
int32_t parse_sat_delegate_incremental_mode(const char *value, sat_delegate_incremental_mode_t *v) {
14✔
424
  int32_t k;
425

426
  k = parse_as_keyword(value, sat_delegate_incremental_mode_names,
14✔
427
                       sat_delegate_incremental_mode_code, NUM_SAT_DELEGATE_INCREMENTAL_MODES);
428
  assert(k >= 0 || k == -1);
429

430
  if (k >= 0) {
14✔
431
    assert(SAT_DELEGATE_MODE_REBUILD <= k && k <= SAT_DELEGATE_MODE_SELECTOR_FRAMES);
432
    *v = (sat_delegate_incremental_mode_t) k;
14✔
433
    return 0;
14✔
434
  }
435

436
  return -2;
×
437
}
438

439
sat_delegate_incremental_mode_t sat_delegate_default_incremental_mode(sat_delegate_t delegate, bool one_check) {
11✔
440
  if (one_check) {
11✔
441
    return SAT_DELEGATE_MODE_REBUILD;
×
442
  }
443

444
  switch (delegate) {
11✔
445
  case SAT_DELEGATE_Y2SAT:
2✔
446
    return SAT_DELEGATE_MODE_APPEND;
2✔
447
  case SAT_DELEGATE_CADICAL:
9✔
448
  case SAT_DELEGATE_CRYPTOMINISAT:
449
    return SAT_DELEGATE_MODE_SELECTOR_FRAMES;
9✔
450
  case SAT_DELEGATE_KISSAT:
×
451
  case SAT_DELEGATE_NONE:
452
  default:
453
    return SAT_DELEGATE_MODE_REBUILD;
×
454
  }
455
}
456

457
bool sat_delegate_incremental_mode_supported(sat_delegate_t delegate, sat_delegate_incremental_mode_t mode) {
64✔
458
  switch (mode) {
64✔
459
  case SAT_DELEGATE_MODE_REBUILD:
12✔
460
    return true;
12✔
461
  case SAT_DELEGATE_MODE_APPEND:
14✔
462
    return delegate == SAT_DELEGATE_Y2SAT ||
7✔
463
           delegate == SAT_DELEGATE_CADICAL ||
21✔
464
           delegate == SAT_DELEGATE_CRYPTOMINISAT;
465
  case SAT_DELEGATE_MODE_SELECTOR_FRAMES:
38✔
466
    return delegate == SAT_DELEGATE_CADICAL ||
38✔
467
           delegate == SAT_DELEGATE_CRYPTOMINISAT;
468
  default:
×
469
    return false;
×
470
  }
471
}
472

473
bool effective_sat_delegate_incremental_mode(sat_delegate_t delegate,
92✔
474
                                             sat_delegate_incremental_mode_t config_mode,
475
                                             bool config_mode_set,
476
                                             bool one_check_context,
477
                                             bool one_shot_delegate,
478
                                             sat_delegate_incremental_mode_t *mode) {
479
  if (one_shot_delegate) {
92✔
480
    *mode = SAT_DELEGATE_MODE_REBUILD;
30✔
481
    return true;
30✔
482
  }
483

484
  if (config_mode_set) {
62✔
485
    *mode = config_mode;
51✔
486
    return !(one_check_context && *mode != SAT_DELEGATE_MODE_REBUILD) &&
102✔
487
           sat_delegate_incremental_mode_supported(delegate, *mode);
51✔
488
  }
489

490
  *mode = sat_delegate_default_incremental_mode(delegate, one_check_context);
11✔
491
  return true;
11✔
492
}
493

494
sat_delegate_t effective_sat_delegate_mode(sat_delegate_t config_delegate, const param_t *params, bool *one_shot) {
2,792✔
495
  sat_delegate_t req;
496

497
  req = SAT_DELEGATE_NONE;
2,792✔
498
  if (params != NULL) {
2,792✔
499
    req = params->delegate;
2,792✔
500
  }
501

502
  if (req != SAT_DELEGATE_NONE) {
2,792✔
503
    if (one_shot != NULL) {
37✔
504
      *one_shot = (req != config_delegate || config_delegate == SAT_DELEGATE_NONE);
37✔
505
    }
506
    return req;
37✔
507
  }
508

509
  if (one_shot != NULL) {
2,755✔
510
    *one_shot = false;
2,755✔
511
  }
512
  return config_delegate;
2,755✔
513
}
514

515

516

517
/****************
518
 *  FUNCTIONS   *
519
 ***************/
520

521
/*
522
 * Initialize params with a copy of default_settings
523
 */
524
void init_params_to_defaults(param_t *parameters) {
7,271✔
525
  *parameters = default_settings;
7,271✔
526
}
7,271✔
527

528

529
/*
530
 * Return the default parameters
531
 */
532
const param_t *get_default_params(void) {
×
533
  return &default_settings;
×
534
}
535

536

537
/*
538
 * Parse value as a boolean. Store the result in *v
539
 * - return 0 if this works
540
 * - return -2 otherwise
541
 */
542
static int32_t set_bool_param(const char *value, bool *v) {
×
543
  int32_t k;
544

545
  k = parse_as_boolean(value, v);
×
546
  return (k == valid_boolean) ? 0 : -2;
×
547
}
548

549

550
/*
551
 * Parse value as a branching mode. Store the result in *v
552
 * - return 0 if this works
553
 * - return -2 otherwise
554
 */
555
static int32_t set_branching_param(const char *value, branch_t *v) {
×
556
  int32_t k;
557

558
  k = parse_as_keyword(value, branching_modes, branching_code, NUM_BRANCHING_MODES);
×
559
  assert(k >= 0 || k == -1);
560

561
  if (k >= 0) {
×
562
    assert(BRANCHING_DEFAULT <= k && k <= BRANCHING_TH_POS);
563
    *v = (branch_t) k;
×
564
    k = 0;
×
565
  } else {
566
    k = -2;
×
567
  }
568

569
  return k;
×
570
}
571

572
/*
573
 * Parse value as supplementary MCSAT check mode. Store the result in *v.
574
 * - return 0 if this works
575
 * - return -2 otherwise
576
 */
577
static int32_t set_mcsat_supplement_check_param(const char *value, mcsat_supplement_check_t *v) {
2✔
578
  int32_t k;
579

580
  k = parse_as_keyword(value, mcsat_supplement_check_modes, mcsat_supplement_check_code,
2✔
581
                       NUM_MCSAT_SUPPLEMENT_CHECK_MODES);
582
  assert(k >= 0 || k == -1);
583

584
  if (k >= 0) {
2✔
585
    assert(MCSAT_SUPPLEMENT_CHECK_BOTH <= k && k <= MCSAT_SUPPLEMENT_CHECK_FINAL_ONLY);
586
    *v = (mcsat_supplement_check_t) k;
2✔
587
    k = 0;
2✔
588
  } else {
NEW
589
    k = -2;
×
590
  }
591
  return k;
2✔
592
}
593

594
/*
595
 * Parse value as a SAT delegate mode. Store the result in *v
596
 * - return 0 if this works
597
 * - return -2 otherwise
598
 */
599
static int32_t set_sat_delegate_param(const char *value, sat_delegate_t *v) {
32✔
600
  return parse_sat_delegate(value, v);
32✔
601
}
602

603

604
/*
605
 * Parse val as a signed 32bit integer. Check whether
606
 * the result is in the interval [low, high].
607
 * - if so, store the result into *v and return 0
608
 * - if val is not an integer, return -2
609
 * - if the result is not in the interval, return -2
610
 */
611
static int32_t set_int32_param(const char *value, int32_t *v, int32_t low, int32_t high) {
×
612
  integer_parse_code_t k;
613
  int32_t aux;
614

615
  k = parse_as_integer(value, &aux);
×
616
  switch (k) {
×
617
  case valid_integer:
×
618
    if (low <= aux && aux <= high) {
×
619
      *v = aux;
×
620
      aux = 0;
×
621
    } else {
622
      aux = -2;
×
623
    }
624
    break;
×
625

626
  case integer_overflow:
×
627
  case invalid_integer:
628
  default: // prevent GCC warning
629
    aux = -2;
×
630
    break;
×
631
  }
632

633
  return aux;
×
634
}
635

636

637
/*
638
 * Parse value as an unsigned integer
639
 * - no interval check
640
 * - if val is not an unsigned integer, return -2
641
 */
642
static int32_t set_uint32_param(const char *value, uint32_t *v) {
×
643
  integer_parse_code_t k;
644
  int32_t code;
645

646
  k = parse_as_uint(value, v);
×
647
  switch (k) {
×
648
  case valid_integer:
×
649
    code = 0;
×
650
    break;
×
651

652
  case integer_overflow:
×
653
  case invalid_integer:
654
  default:
655
    code = -2;
×
656
    break;
×
657
  }
658

659
  return code;
×
660
}
661

662

663

664
/*
665
 * Parse value as a double. Check whether
666
 * the result is in the interval [low, high].
667
 * - if so, store the result into *v and return 0
668
 * - if the string can't be parse as a double, return -1
669
 * - if the result is not in the interval, return -2
670
 */
671
static int32_t set_double_param(const char *value, double *v, double low, double high) {
×
672
  double_parse_code_t k;
673
  double aux;
674
  int32_t result;
675

676
  k = parse_as_double(value, &aux);
×
677
  switch (k) {
×
678
  case valid_double:
×
679
    if (low <= aux && aux <= high) {
×
680
      *v = aux;
×
681
      result = 0;
×
682
    } else {
683
      result = -2;
×
684
    }
685
    break;
×
686

687
  case double_overflow:
×
688
  case invalid_double:
689
  default: // prevent GCC warning
690
    result = -1;
×
691
    break;
×
692
  }
693

694
  return result;
×
695
}
696

697

698

699

700
/*
701
 * Set a field in the parameter record.
702
 * - key = field name
703
 * - value = value for that field
704
 *
705
 * Return code:
706
 *   -1 if the key is not recognized
707
 *   -2 if the value is not recognized
708
 *   -3 if the value has the wrong type for the key
709
 *    0 otherwise (i.e., success)
710
 */
711
int32_t params_set_field(param_t *parameters, const char *key, const char *value) {
34✔
712
  int32_t k, r;
713
  int32_t z;
714
  double x;
715

716
  z = 0; // to prevent GCC warning
34✔
717

718
  k = parse_as_keyword(key, param_key_names, param_code, NUM_PARAM_KEYS);
34✔
719
  switch (k) {
34✔
720
  case PARAM_FAST_RESTART:
×
721
    r = set_bool_param(value, &parameters->fast_restart);
×
722
    break;
×
723

724
  case PARAM_C_THRESHOLD:
×
725
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
726
    if (r == 0) {
×
727
      parameters->c_threshold = (uint32_t) z;
×
728
    }
729
    break;
×
730

731
  case PARAM_D_THRESHOLD:
×
732
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
733
    if (r == 0) {
×
734
      parameters->d_threshold = (uint32_t) z;
×
735
    }
736
    break;
×
737

738
  case PARAM_C_FACTOR:
×
739
    r = set_double_param(value, &parameters->c_factor, 1.0, DBL_MAX);
×
740
    break;
×
741

742
  case PARAM_D_FACTOR:
×
743
    r = set_double_param(value, &parameters->d_factor, 1.0, DBL_MAX);
×
744
    break;
×
745

746
  case PARAM_DELEGATE:
32✔
747
    r = set_sat_delegate_param(value, &parameters->delegate);
32✔
748
    break;
32✔
749

750
  case PARAM_R_THRESHOLD:
×
751
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
752
    if (r == 0) {
×
753
      parameters->r_threshold = z;
×
754
    }
755
    break;
×
756

757
  case PARAM_R_FRACTION:
×
758
    r = set_double_param(value, &parameters->r_fraction, 0.0, 1.0);
×
759
    break;
×
760

761
  case PARAM_R_FACTOR:
×
762
    r = set_double_param(value, &parameters->r_factor, 1.0, DBL_MAX);
×
763
    break;
×
764

765
  case PARAM_VAR_DECAY:
×
766
    r = set_double_param(value, &parameters->var_decay, 0.0, 1.0);
×
767
    break;
×
768

769
  case PARAM_RANDOMNESS:
×
770
    r = set_double_param(value, &x, 0.0, 1.0);
×
771
    if (r == 0) {
×
772
      parameters->randomness = (float) x;
×
773
    }
774
    break;
×
775

776
  case PARAM_RANDOM_SEED:
×
777
    r = set_uint32_param(value, &parameters->random_seed);
×
778
    break;
×
779

780
  case PARAM_BRANCHING:
×
781
    r = set_branching_param(value, &parameters->branching);
×
782
    break;
×
783

784
  case PARAM_CLAUSE_DECAY:
×
785
    r = set_double_param(value, &x, 0.0, 1.0);
×
786
    if (r == 0) {
×
787
      parameters->clause_decay = (float) x;
×
788
    }
789
    break;
×
790

791
  case PARAM_CACHE_TCLAUSES:
×
792
    r = set_bool_param(value, &parameters->cache_tclauses);
×
793
    break;
×
794

795
  case PARAM_TCLAUSE_SIZE:
×
796
    r = set_int32_param(value, &z, 2, INT32_MAX);
×
797
    if (r == 0) {
×
798
      parameters->tclause_size = (uint32_t) z;
×
799
    }
800
    break;
×
801

802
  case PARAM_DYN_ACK:
×
803
    r = set_bool_param(value, &parameters->use_dyn_ack);
×
804
    break;
×
805

806
  case PARAM_DYN_BOOL_ACK:
×
807
    r = set_bool_param(value, &parameters->use_bool_dyn_ack);
×
808
    break;
×
809

810
  case PARAM_OPTIMISTIC_FCHECK:
×
811
    r = set_bool_param(value, &parameters->use_optimistic_fcheck);
×
812
    break;
×
813

814
  case PARAM_MAX_ACK:
×
815
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
816
    if (r == 0) {
×
817
      parameters->max_ackermann = (uint32_t) z;
×
818
    }
819
    break;
×
820

821
  case PARAM_MAX_BOOL_ACK:
×
822
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
823
    if (r == 0) {
×
824
      parameters->max_boolackermann = (uint32_t) z;
×
825
    }
826
    break;
×
827

828
  case PARAM_AUX_EQ_QUOTA:
×
829
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
830
    if (r == 0) {
×
831
      parameters->aux_eq_quota = (uint32_t) z;
×
832
    }
833
    break;
×
834

835
  case PARAM_AUX_EQ_RATIO:
×
836
    r = set_double_param(value, &x, 0.0, (double) FLT_MAX);
×
837
    if (r == 0) {
×
838
      if (x > 0.0) {
×
839
        parameters->aux_eq_ratio = (float) x;
×
840
      } else {
841
        r = -2;
×
842
      }
843
    }
844
    break;
×
845

846
  case PARAM_DYN_ACK_THRESHOLD:
×
847
    r = set_int32_param(value, &z, 1, (int32_t) UINT16_MAX);
×
848
    if (r == 0) {
×
849
      parameters->dyn_ack_threshold = (uint16_t) z;
×
850
    }
851
    break;
×
852

853

854
  case PARAM_DYN_BOOL_ACK_THRESHOLD:
×
855
    r = set_int32_param(value, &z, 1, (int32_t) UINT16_MAX);
×
856
    if (r == 0) {
×
857
      parameters->dyn_bool_ack_threshold = (uint16_t) z;
×
858
    }
859
    break;
×
860

861
  case PARAM_MAX_INTERFACE_EQS:
×
862
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
863
    if (r == 0) {
×
864
      parameters->max_interface_eqs = (uint32_t) z;
×
865
    }
866
    break;
×
867

868
  case PARAM_SIMPLEX_PROP:
×
869
    r = set_bool_param(value, &parameters->use_simplex_prop);
×
870
    break;
×
871

872
  case PARAM_SIMPLEX_ADJUST:
×
873
    r = set_bool_param(value, &parameters->adjust_simplex_model);
×
874
    break;
×
875

876
  case PARAM_SIMPLEX_ICHECK:
×
877
    r = set_bool_param(value, &parameters->integer_check);
×
878
    break;
×
879

880
  case PARAM_PROP_THRESHOLD:
×
881
    r = set_int32_param(value, &z, 0, INT32_MAX);
×
882
    if (r == 0) {
×
883
      parameters->max_prop_row_size = (uint32_t) z;
×
884
    }
885
    break;
×
886

887
  case PARAM_BLAND_THRESHOLD:
×
888
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
889
    if (r == 0) {
×
890
      parameters->bland_threshold = (uint32_t) z;
×
891
    }
892
    break;
×
893

894
  case PARAM_ICHECK_PERIOD:
×
895
    r = set_int32_param(value, &parameters->integer_check_period, 1, INT32_MAX);
×
896
    break;
×
897

898
  case PARAM_MAX_UPDATE_CONFLICTS:
×
899
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
900
    if (r == 0) {
×
901
      parameters->max_update_conflicts = (uint32_t) z;
×
902
    }
903
    break;
×
904

905
  case PARAM_MAX_EXTENSIONALITY:
×
906
    r = set_int32_param(value, &z, 1, INT32_MAX);
×
907
    if (r == 0) {
×
908
      parameters->max_extensionality = (uint32_t) z;
×
909
    }
910
    break;
×
911

912
  case PARAM_MCSAT_SUPPLEMENT_CHECK:
2✔
913
    r = set_mcsat_supplement_check_param(value, &parameters->mcsat_supplement_check);
2✔
914
    break;
2✔
915

UNCOV
916
  default:
×
917
    assert(k == -1);
918
    r = -1;
×
919
    break;
×
920
  }
921

922
  return r;
34✔
923
}
924

925

926
/*
927
 * Utility function: so that yices and yices_smt2
928
 * can keep a copy of the initial random seed
929
 */
930
uint32_t params_default_random_seed(void) {
×
931
  return DEFAULT_RANDOM_SEED;
×
932
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc