These examples require OptiMathSAT version 1.5.1 or superior.
~$ ./optimathsat < FILENAME.smt2More examples, each one including a detailed description of OptiMathSAT functionalities, can be found within OptiMathSAT binary distribution.
~$ mkfifo opti-input ~$ mkfifo opti-output ~$ ./optimathsat < opti-input > opti-output 2>&1 ~$ cat > opti-input & # prevents optimathsat termination ~$ cat formula1 > opti-input ...read optimathsat result from opti-output... ...dynamically choose what formula to optimize next... ~$ cat formula2 > opti-input ...and so on...
(set-option:produce-models true)
(set-option:opt.priority box)
;
; PROBLEM
;
(declare-fun x () (_ BitVec 8))
(assert (or
(and (bvsle ((_ to_bv 8) 120) x)
(bvsle x ((_ to_bv 8) 120))
)
(and (bvsle ((_ to_bv 8) 97) x)
(bvsle x ((_ to_bv 8) 97))
)
(and (bvsle ((_ to_bv 8) 54) x)
(bvsle x ((_ to_bv 8) 54))
)
(and (bvsle ((_ to_bv 8) 32) x)
(bvsle x ((_ to_bv 8) 32))
)
(and (bvsle ((_ to_bv 8) 22) x)
(bvsle x ((_ to_bv 8) 22))
)
(and (bvsle ((_ to_bv 8) 11) x)
(bvsle x ((_ to_bv 8) 11))
)
(and (bvsle ((_ to_bv 8) 8) x)
(bvsle x ((_ to_bv 8) 8))
)
(and (bvsle ((_ to_bv 8) (- 7)) x)
(bvsle x ((_ to_bv 8) (- 7)))
)
(and (bvsle ((_ to_bv 8) (- 16)) x)
(bvsle x ((_ to_bv 8) (- 16)))
)
(and (bvsle ((_ to_bv 8) (- 105)) x)
(bvsle x ((_ to_bv 8) (- 105)))
)
))
;
; GOALS
;
(minimize x)
(minimize x :signed)
;
; OPTIMIZATION + OPTIMUM VALUES
;
(check-sat)
(get-objectives)
(exit)
(set-option :opt.priority box) ; ; PROBLEM ; (declare-fun x () Real) (declare-fun y () Real) (declare-fun z () Real) (declare-fun t () Real) ; ; GOALS ; (minimize x) (minimize y) (minimize z) (minimize t) (maximize (+ y 1)) ; ; OPTIMIZATION + OPTIMUM VALUES ; (check-sat) (get-objectives) (exit)
(set-option :opt.priority box)
;
; PROBLEM
;
(declare-fun x () Real)
(declare-fun y () Real)
(declare-fun z () Real)
(assert (and
(<= 42 x)
(<= y x)
))
;
; GOALS
;
(minimize x)
(maximize y)
(maximize z)
;
; OPTIMIZATION + OPTIMUM VALUES
;
(check-sat)
(get-objectives)
(exit)
(set-option :produce-models true)
(set-option :opt.priority box)
;
; PROBLEM
;
(declare-fun production_cost () Real)
(declare-fun q0 () Real) ; machine 'i' production load
(declare-fun q1 () Real)
(declare-fun q2 () Real)
(declare-fun q3 () Real)
(declare-fun m0 () Bool) ; machine 'i' is used
(declare-fun m1 () Bool)
(declare-fun m2 () Bool)
(declare-fun m3 () Bool)
(assert (<= 1100 (+ q0 q1 q2 q3))) ; set goods quantity
(assert (and ; set goods produced per machine
(and (<= 0 q0) (<= q0 800)) (and (<= 0 q1) (<= q1 500))
(and (<= 0 q2) (<= q2 600)) (and (<= 0 q3) (<= q3 200))
))
(assert (and ; set machine `used` flag
(=> (< 0 q0) m0) (=> (< 0 q1) m1)
(=> (< 0 q2) m2) (=> (< 0 q3) m3)
))
(assert-soft (not m0) :id used_machines)
(assert-soft (not m1) :id used_machines)
(assert-soft (not m2) :id used_machines)
(assert-soft (not m3) :id used_machines)
;
; GOALS
; - 'total_cost' is a combination of 'production_cost'
; and 'used_machines'
;
(minimize
(+ (* q0 8) (* q1 9) (* q2 9) (* q3 5))
:id production_cost
)
(minimize (+ production_cost
(* (/ 785 10) (+ (* 2 used_machines) 8))
)
:id total_cost
)
;
; OPTIMIZATION + MODEL VALUES
;
(check-sat)
(get-objectives)
(load-objective-model 1)
(get-value (total_cost))
(get-value (production_cost))
(exit)
; ; PROBLEM ; (declare-fun x () Real) (push 1) (assert (<= 5 x)) (minimize x) (check-sat) (get-objectives) (pop 1) (push 1) (maximize x) (check-sat) (get-objectives) (pop 1) (check-sat) (get-objectives) (exit)
(set-option :produce-models true)
(set-option :opt.priority lex)
;
; PROBLEM
;
(declare-fun cost () Real)
(declare-fun s1 () Bool)
(declare-fun s2 () Bool)
(declare-fun s3 () Bool)
(declare-fun s4 () Bool)
(declare-fun q1 () Real)
(declare-fun q2 () Real)
(declare-fun q3 () Real)
(declare-fun q4 () Real)
; set goods quantity
(assert (= 250 (+ q1 q2 q3 q4)))
; set goods offered by each supplier
(assert (or (= q1 0) (and (<= 50 q1) (<= q1 250))))
(assert (or (= q2 0) (and (<= 100 q2) (<= q2 150))))
(assert (or (= q3 0) (and (<= 100 q3) (<= q3 100))))
(assert (or (= q4 0) (and (<= 50 q4) (<= q4 100))))
; supplier is used if sends more than zero items
(assert (and (=> s1 (not (= q1 0))) (=> s2 (not (= q2 0)))
(=> s3 (not (= q3 0))) (=> s4 (not (= q4 0)))))
; supply from the largest number of suppliers
(assert-soft s1 :id unused_suppliers)
(assert-soft s2 :id unused_suppliers)
(assert-soft s3 :id unused_suppliers)
(assert-soft s4 :id unused_suppliers)
;
; GOAL
;
(minimize (+ (* q1 23) (* q2 21) (* q3 20) (* q4 10)))
(minimize unused_suppliers)
;
; OPTIMIZATION + OPTIMUM VALUES
;
(check-sat)
(get-objectives)
(exit)
; ; MaxSMT Engine: ; - omt: use OMT-based encoding & engine ; - maxres: use Maximum Resolution engine ; - ext: use external MaxSAT solver (only via API) ; (set-option :opt.maxsat_engine maxres) ; ; MaxSMT PROBLEM ; (declare-fun x () Int) (declare-fun y () Int) (assert (= x (- y))) (assert-soft (< x 0) :weight 1 :id goal) (assert-soft (< x y) :weight 1 :id goal) (assert-soft (< y 0) :weight 1 :id goal) ; ; GOAL ; (minimize goal) ; ; OPTIMIZATION + OPTIMUM VALUE ; (check-sat) (get-objectives) (exit)
(set-option :opt.priority box) ; ; PROBLEM ; (declare-fun l0 () Int) (declare-fun l1 () Int) (declare-fun l2 () Int) (assert (< 10 l0)) (assert (< 12 l1)) (assert (< 14 l2)) ; ; GOAL ; (minmax l0 l1 l2 :id my_cost) ; ; OPTIMIZATION ; (check-sat) (get-objectives) (exit)
(set-option :produce-models true)
(set-option :opt.priority pareto)
;
; PROBLEM
;
(declare-fun a () Real)
(declare-fun b () Real)
(assert (or
(and (= a 1) (= b 1))
(and (= a 2) (= b 1))
(and (= a 1) (= b 2))
(and (= a 2) (= b 2))
(and (= a 3) (= b 1))
(and (= a 1) (= b 3))
))
;
; GOALS
;
(maximize a)
(maximize b)
;
; INCREMENTAL OPTIMIZATION
; 3 pareto solutions
; + unsat step
;
(check-sat)
(get-objectives)
(check-sat)
(get-objectives)
(check-sat)
(get-objectives)
(check-sat)
(get-objectives)
(exit)
;
; ENABLE MODEL GENERATION
;
(set-option :produce-models true)
;
; PROBLEM
;
(declare-fun x () Int)
(declare-fun y () Int)
(declare-fun z () Int)
(assert (and
(<= 3 x)
(<= x 5)
))
(assert (and
(<= 10 z)
(<= z 20)
))
(assert (= y (+ (* 2 x) z)))
;
; GOALS
;
(minimize x)
(maximize y)
;
; BOXED OPTIMIZATION + 2 MODELS
;
(set-option :opt.priority box)
(check-sat)
(get-objectives)
;(get-model) error in box mode when multiple objectives are present
(load-objective-model 0) ; minimize x
(get-model)
(load-objective-model 1) ; maximize y
(get-model)
;
; LEXICOGRAPHIC OPTIMIZATION + 2 MODELS
;
(set-option :opt.priority lex)
(check-sat)
(get-objectives)
(get-model)
(load-objective-model 0) ; minimize x
(get-model)
(load-objective-model 1) ; maximize y
(get-model)
(exit)