Coverage for docs/source/examples/issue_1513.py: 100%

56 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-01-07 22:15 -0500

1"Tests non-array linked functions & subs in a vectorization environment" 

2import numpy as np 

3from gpkit import Variable, Model, ConstraintSet, Vectorize 

4# pylint: disable=unnecessary-lambda-assignment 

5 

6class Vehicle(Model): 

7 "Vehicle model" 

8 def setup(self): 

9 self.a = a = Variable("a") 

10 constraints = [a >= 1] 

11 return constraints 

12 

13class System(Model): 

14 "System model" 

15 def setup(self): 

16 with Vectorize(1): 

17 self.Fleet2 = Fleet2() 

18 constraints = [self.Fleet2] 

19 self.cost = sum(self.Fleet2.z) 

20 return constraints 

21 

22class Fleet2(Model): 

23 "Fleet model (composed of multiple Vehicles)" 

24 def setup(self): 

25 x = Variable("x") 

26 lambdafun = lambda c: [c[x]-1, np.ones(x.shape)] 

27 with Vectorize(2): 

28 y = Variable("y", lambdafun) 

29 self.Vehicle = Vehicle() 

30 

31 self.z = z = Variable("z") 

32 substitutions = {"x": 4} 

33 constraints = [ 

34 z >= sum(y/x*self.Vehicle.a), 

35 self.Vehicle, 

36 ] 

37 return constraints, substitutions 

38 

39m = System() 

40sol = m.solve(verbosity=0) 

41print(sol.table()) 

42 

43# now with more fleets per system 

44class System2(Model): 

45 "System model" 

46 def setup(self): 

47 with Vectorize(3): 

48 self.Fleet2 = Fleet2() 

49 constraints = [self.Fleet2] 

50 self.cost = sum(self.Fleet2.z) 

51 return constraints 

52 

53m = System2() 

54sol = m.solve(verbosity=0) 

55print(sol.table()) 

56 

57 

58# now testing substitutions 

59 

60class Simple(Model): 

61 "Simple model" 

62 def setup(self): 

63 self.x = x = Variable("x") 

64 y = Variable("y", 1) 

65 z = Variable("z", 2) 

66 constraints = [ 

67 x >= y + z, 

68 ] 

69 return constraints 

70 

71class Cake(Model): 

72 "Cake model" 

73 def setup(self): 

74 with Vectorize(3): 

75 s = Simple() 

76 c = ConstraintSet([s]) 

77 self.cost = sum(s.x) 

78 return c 

79 

80m = Cake() 

81m.substitutions.update({ 

82 "y": ("sweep", [1, 2, 3]), 

83 "z": lambda v: v("y")**2, 

84}) 

85sol = m.solve(verbosity=0) 

86print(sol.table())