#!/usr/bin/env python
#-*- coding:utf-8 -*-
##
## utils.py
##
"""
Utilities for explanation techniques
=================
List of functions
=================
.. autosummary::
:nosignatures:
make_assump_model
"""
import cpmpy as cp
from cpmpy.transformations.normalize import toplevel_list
[docs]def make_assump_model(soft, hard=[], name=None):
"""
Construct implied version of all soft constraints.
Can be used to extract cores (see :func:`tools.mus() <cpmpy.tools.explain.mus.mus>`).
Provide name for assumption variables with `name` param.
"""
# ensure toplevel list
soft2 = toplevel_list(soft, merge_and=False)
# make assumption variables
assump = cp.boolvar(shape=(len(soft2),), name=name)
# hard + implied soft constraints
hard = toplevel_list(hard)
model = cp.Model(hard + [assump.implies(soft2)]) # each assumption variable implies a candidate
return model, soft2, assump