Source code for eml.util

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json

# ===========================================================================
# Encode Piecewise Linear Function
# ===========================================================================

# def encode_pwl(bkd, mdl, xvars, nodes, mode='sos2', name=None):
#     # Cache some fields
#     nnodes = len(nodes[0])
#     # Build node amount variables
#     tvars = []
#     for i in range(nnodes):
#         vname = None if name is None else '%s_a%d' % (name, i)
#         tvars.append(bkd.var_cont(mdl, lb=0, ub=1, name=vname))
#     # Ensure that we have a convex combination
#     bkd.cst_eq(mdl, bkd.xpr_sum(mdl, tvars), 1)
#     # Link the node amounts with the node values and the model variables
#     for xvar, lnodes in zip(xvars, nodes):
#         xpr = bkd.xpr_scalprod(mdl, lnodes, tvars)
#         bkd.cst_eq(mdl, xvar, xpr)
#     # Associate an integer "flag" variable to each node
#     ivars = []
#     for i in range(nnodes):
#         vname = None if name is None else '%s_f%d' % (name, i)
#         ivars.append(bkd.var_bin(mdl, name=vname))
#     # Connect the node amount and flag variables
#     for i in range(nnodes):
#         bkd.cst_leq(mdl, tvars[i], ivars[i])
#     # No more than 2 active flag variables
#     xpr = bkd.xpr_sum(mdl, ivars)
#     bkd.cst_leq(mdl, xpr, 2)
#     # Non contiguous flag variables cannot be simultanously active
#     for i in range(nnodes):
#         for j in range(i+2, nnodes):
#             xpr = bkd.xpr_sum(mdl, [ivars[i], ivars[j]])
#             bkd.cst_leq(mdl, xpr, 1)


# ===========================================================================
# Genericl model descriptor
# ===========================================================================

[docs]class ModelDesc: """ Class used to shape a model descriptor A model descriptor summarize the main feature a system, in this case will be used for empirical model learning models Attributes ---------- _ml : Machine learning model _mdl : Optimization model _name : Name of the model _exps : string Expressions in the model Parameters --------- ml : Machine learning model mdl : Optimization model name : string Name of the model """ def __init__(self, ml, mdl, name): self._ml = ml # ml model self._mdl = mdl # opt model self._name = name self._exps = {}
[docs] def store(self, xtype, xidx, val): """ Store expression Parameters ---------- xtype : string Type of expression xidx : int Index we want to use to store the expression val: Value to store """ try: len(xidx) except: xidx = (xidx,) self._exps[(xtype,) + xidx] = val
[docs] def get(self, xtype, xidx): """ Get expression Parameters ---------- xtype : string Type of expression xidx : int Index we want to use to store the expression Returns ------- Expr : `generic type`` Expression located by the coordinates """ try: len(xidx) except: xidx = (xidx,) return self._exps[(xtype,) + xidx]
[docs] def has(self, xtype, xidx): """ Check if the model contains an expression given some coordinares Parameters ---------- xtype : string Type of expression xidx : int Index we want to use to store the expression Returns ------- Acknowledge : bool True if the expression is present, False otherwise """ try: len(xidx) except: xidx = (xidx,) return ((xtype,) + xidx) in self._exps
[docs] def expressions(self): """ Get all the expressions stored Returns ------- Expressions : dict(expr) Set of the expressions in the model """ return self._exps
[docs] def name(self): """ Get name of the model Returns ------- Name : string Name of the model """ return self._name
[docs] def model(self): """ Get the optimization model Returns ------- Optimization Model : :obj:`docplex.mp.model.Model` Combinatorial system """ return self._mdl
[docs] def ml_model(self): """ Get machine learning model Returns ------- Machine learning model : `generic type` Machine learning model """ return self._ml
def __repr__(self): """ Representation of the layer Returns ------- Representation : string String representing the layer """ s = '' s += 'Model Name: ' + self._name + '\n' s += 'Machine Learning Model: ' + str(type(self._ml)) + '\n' s += 'Optimization Model: ' + str(type(self._mdl)) + '\n' # s += json.dumps(self._exps, indent=4, sort_keys=True) s += str(self._exps) return s