Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

from __future__ import absolute_import 

from gpkit import Model 

from gpkit.nomials import MonomialEquality, PosynomialInequality 

from gpkit.exceptions import InvalidGPConstraint 

 

from .equivalent_posynomials import EquivalentPosynomials 

from .twoterm_approximation import TwoTermApproximation 

 

 

class EquivalentModel(Model): 

""" 

A class that generates models that are equivalent to the original models and ready to be 

robustified. 

""" 

number_of_no_data_constraints = None 

 

def setup(self, model, dependent_uncertainties, setting): 

""" 

generates an equivalent model that might not be ready for robustification 

:param model: the original model 

:param setting: robustness setting 

:param dependent_uncertainties: if the uncertainty set is dependent or not 

:return: the equivalent model 

""" 

data_constraints, no_data_constraints = [], [] 

 

for i, p in enumerate(model.as_posyslt1()): 

 

equivalent_p = EquivalentPosynomials(p, i, 

setting.get('simpleModel'), dependent_uncertainties) 

no_data, data = equivalent_p.no_data_constraints, equivalent_p.data_constraints 

 

data_constraints += data 

no_data_constraints += no_data 

 

self.number_of_no_data_constraints = len(no_data_constraints) 

self.cost = model.cost 

return [no_data_constraints, data_constraints] 

 

def get_number_of_no_data_constraints(self): 

return self.number_of_no_data_constraints 

 

 

class TwoTermBoydModel(Model): 

 

def setup(self, model): 

""" 

generates a two term Boyd model that is ready to be linearized 

:param model: the original model 

:return: two term model and the number of no data constraints 

""" 

all_constraints = model.flat(constraintsets=False) 

 

data_constraints = [] 

 

for i, cs in enumerate(all_constraints): 

if isinstance(cs, MonomialEquality): 

data_constraints += [cs] 

elif isinstance(cs, PosynomialInequality): 

_, data = TwoTermApproximation. \ 

two_term_equivalent_posynomial(cs.as_posyslt1()[0], i, [], True) 

data_constraints += data 

del data 

else: 

raise InvalidGPConstraint("Two Term Boyd Model supports geometric programs only") 

self.cost = model.cost 

 

return data_constraints 

 

if __name__ == '__main__': 

pass