Skip to content

Commit 3aeb871

Browse files
commercial final
1 parent ee30b5a commit 3aeb871

1 file changed

Lines changed: 43 additions & 145 deletions

File tree

ConstraintModels/ExampleCMLRuleSets/CommercialFinal.cml

Lines changed: 43 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -5,72 +5,40 @@ type CommercialPropertyInsurance {
55
@(defaultValue = "ABCD1234")
66
string SIC_Code;
77

8-
// @(defaultValue = "10000")
9-
// For large range value, don’t set defaultValue(@defaultValue= xxx) in model, and use configurable=false IF the attribute isn't being set in a constraint
108
@(configurable=false)
119
int Agreed_Value = [0..1000000];
1210

13-
1411
string Cause_Of_Loss = ["Broad", "Special", "Basic"];
1512

16-
@(closeRelation=true, propagateUp=true, sequence = 1)
13+
@(closeRelation=true, propagateUp=true)
1714
relation commerciallocationclass : CommercialLocationClass[0..10] {
1815
locationCaStateCount = count(State == "CA");
1916
locationTxStateCount = count(State == "TX");
17+
@(defaultValue = 0)
2018
commLocBuildAge6Count = count(Location.locBuildAge6Count > 0);
19+
@(defaultValue = 0)
2120
commLocBuildEquipGoodCount = count(Location.locBuildEquipGoodCountInt > 0);
21+
@(defaultValue = 0)
2222
locationMaxBuildingCovLimit = max(Location.commercialBuildingCovLimit);
23+
@(defaultValue = 0)
2324
locationMaxWarehouseCovLimit = max(Location.warehouseBuildingCovLimit);
2425
locationSumBuildingEquipVal = sum(Location.buildingSumEquipValue);
2526
}
2627

27-
/* Hide attribute rule */
2828
rule(Agreed_Value > 10000, "hide", "attribute", "SIC_Code");
2929

30-
//int wareHouseCoverageLimitOnRootLevel = commerciallocationclass.locationMaxWarehouseCovLimit;
31-
string msg0922 = strformat("DEBUG: commLocBuildAge6Count is %d", commerciallocationclass.commLocBuildAge6Count);
32-
string msg0924 = strformat("DEBUG: commLocBuildEquipGoodCount is %d", commerciallocationclass.commLocBuildEquipGoodCount);
33-
message(true, msg0922);
34-
message(true, msg0924);
35-
36-
37-
@(closeRelation=true, sequence = 2)
30+
@(closeRelation=true)
3831
relation generalliabilitycoverage : GeneralLiabilityCoverage[0..1];
39-
@(nullAssignable=true)
40-
int childCommBuildCovLimit = (commerciallocationclass.locationMaxBuildingCovLimit !=null ) ? commerciallocationclass.locationMaxBuildingCovLimit : 0;
41-
@(nullAssignable=true)
42-
int childWarehouseBuildCovLimit = (commerciallocationclass.locationMaxWarehouseCovLimit != null) ? commerciallocationclass.locationMaxWarehouseCovLimit : 0;
43-
@(nullAssignable=true)
44-
int childLocBuildAge6Count = (commerciallocationclass.commLocBuildAge6Count != null) ? commerciallocationclass.commLocBuildAge6Count : 0;
45-
@(nullAssignable=true)
46-
int childLocBuildEquipGoodCount = (commerciallocationclass.commLocBuildEquipGoodCount !=null ) ? commerciallocationclass.commLocBuildEquipGoodCount : 0;
47-
@(nullAssignable=true)
48-
int childCommercialEquipmentValueSum = (commerciallocationclass.locationSumBuildingEquipVal != null ) ? commerciallocationclass.locationSumBuildingEquipVal : 0;
49-
50-
// boolean genLiabLimitRuleCondition = commerciallocationclass.locationTxStateCount == 0 && (childWarehouseBuildCovLimit < 20000 && childCommBuildCovLimit < 50000) && childCommercialEquipmentValueSum > 100000 && generalliabilitycoverage[GeneralLiabilityCoverage] > 0;
51-
52-
string msgg4 = strformat("ROOT LEVEL: locationTxStateCount is %d", commerciallocationclass.locationTxStateCount);
53-
message(true, msgg4);
54-
string msgg3 = strformat("ROOT LEVEL: childWarehouseBuildCovLimit is %d", childWarehouseBuildCovLimit);
55-
@(nullAssignable=true)
56-
int test = (commerciallocationclass.locationMaxWarehouseCovLimit != null) ? commerciallocationclass.locationMaxWarehouseCovLimit : 0;
57-
message(1==1, "var =: {}", test);
58-
message(true, msgg3);
59-
string msgg2 = strformat("ROOT LEVEL: childCommBuildCovLimit is %d", childCommBuildCovLimit);
60-
message(true, msgg2);
61-
string msgg5 = strformat("ROOT LEVEL: childCommercialEquipmentValueSum is %d", childCommercialEquipmentValueSum);
62-
message(true, msgg5);
63-
64-
65-
/* Top-down rule: Set default product rule - currently enforces the rule, known gap in 256 */
66-
preference((Cause_Of_Loss == "Basic" && commerciallocationclass.locationCaStateCount > 0) -> generalliabilitycoverage[GeneralLiabilityCoverage], "General Liability coverage is default selected when cause of loss is basic and domestic location state is CA");
67-
/* Top-down rule: Auto-add general liability coverage if building age is 6 and equipment condition is good */
68-
32+
33+
int childCommBuildCovLimit = commerciallocationclass.locationMaxBuildingCovLimit;
34+
int childWarehouseBuildCovLimit = commerciallocationclass.locationMaxWarehouseCovLimit;
35+
int childLocBuildAge6Count = commerciallocationclass.commLocBuildAge6Count;
36+
int childLocBuildEquipGoodCount = commerciallocationclass.commLocBuildEquipGoodCount;
37+
int childCommercialEquipmentValueSum = commerciallocationclass.locationSumBuildingEquipVal;
38+
6939
require(childLocBuildAge6Count > 0 && childLocBuildEquipGoodCount > 0, generalliabilitycoverage[GeneralLiabilityCoverage] {General_Liability_Limit = 50000}, "General Liability coverage is required when Building age is 6 and Equipment condition is Good");
70-
/* Top-down rule - general liability coverage should be 50k if all location not TX, max building cov < 50k, max warehouse cov < 20k, and equipment val min > 100k */
7140
boolean glLimitCondition = commerciallocationclass.locationTxStateCount == 0 && (childWarehouseBuildCovLimit < 20000 && childCommBuildCovLimit < 50000) && childCommercialEquipmentValueSum > 100000 && generalliabilitycoverage[GeneralLiabilityCoverage] == 1;
7241

73-
//int generalLiabilityLimit = (generalliabilitycoverage[GeneralLiabilityCoverage] > 0) ? generalliabilitycoverage[GeneralLiabilityCoverage].General_Liability_Limit : 0;
7442
int generalLiabilityLimit = [1000, 2000, 5000, 10000, 25000, 50000];
7543
}
7644

@@ -88,57 +56,35 @@ type CommercialLocationClass {
8856

8957
@(defaultValue = "California")
9058
string State;
91-
92-
/* Set default attribute value rule */
93-
preference(City == "SFO" -> State == "CA", "State should be CA if City is SFO");
9459
}
9560

9661
type Location : CommercialLocationClass {
97-
// int maxWarehouseCovLimit = 0;
98-
@(closeRelation=true, propagateUp=true, sequence = 1)
62+
@(closeRelation=true, propagateUp=true)
9963
relation commercialbuildingclass : CommercialBuildingClass[0..10] {
64+
@(defaultValue = 0)
10065
buildingAge6Count = count(Building_Age == 6);
66+
@(defaultValue = 0)
10167
locBuildEquipGoodCount = count(Building.buildEquipGoodConditionCount > 0);
68+
@(defaultValue = 0)
10269
maxBuildCovLimit = max(Building.commercialBurglaryCovLimit);
70+
@(defaultValue = 0)
10371
maxWarehouseCovLimit = max(Warehouse.warehouseBurglaryCovLimit);
72+
@(defaultValue = 0)
10473
sumBuildingEquipVal = sum(Building.buildingEquipValSum);
10574
}
10675

107-
constraint(commercialbuildingclass.maxWarehouseCovLimit > 0 -> City == "Palo Alto", "if this location has ware house with coverage limit, default city to Palo Alto");
108-
10976
int genLimit = parent(generalLiabilityLimit);
11077

11178
string locationProdState = State;
11279

113-
@(nullAssignable=true)
11480
int locBuildAge6Count = (commercialbuildingclass[CommercialBuildingClass] > 0) ? commercialbuildingclass.buildingAge6Count : 0;
115-
@(nullAssignable=true)
11681
int locBuildEquipGoodCountInt = (commercialbuildingclass[CommercialBuildingClass] > 0) ? commercialbuildingclass.locBuildEquipGoodCount : 0;
117-
@(nullAssignable=true)
11882
int commercialBuildingCovLimit = (commercialbuildingclass[Building] > 0) ? commercialbuildingclass.maxBuildCovLimit : 0;
119-
120-
// int warehouseBuildingCovLimit = 0; // setting hardcoded value avoids unbound message
121-
// int buildCard = cardinality(Building);
122-
// int wareCard = cardinality(Warehouse);
123-
// string msggloc3 = strformat("buildCard is %d", buildCard);
124-
// message(true, msggloc3);
125-
// string msggloc4 = strformat("wareCard is %d", wareCard);
126-
// message(true, msggloc4);
127-
// int maxWare = (wareCard == 0) ? 0 : max(commercialbuildingclass[Warehouse].warehouseBurglaryCovLimit, 0);
128-
// int maxWare = max(commercialbuildingclass[Warehouse].warehouseBurglaryCovLimit, 0);
129-
@(nullAssignable=true)
130-
int warehouseBuildingCovLimit = (commercialbuildingclass[Warehouse] > 0) ? commercialbuildingclass.maxWarehouseCovLimit : 0; // leads to unbound when warehouse instance is empty, needs to default to 0
131-
// constraint(commercialbuildingclass[Warehouse] > 0 -> warehouseBuildingCovLimit == commercialbuildingclass.maxWarehouseCovLimit); // runs into timeout limit
132-
@(nullAssignable=true)
133-
int buildingSumEquipValue = (commercialbuildingclass[CommercialBuildingClass] > 0) ? commercialbuildingclass.sumBuildingEquipVal : 0;
134-
135-
string msggloc1 = strformat("LOCATION LEVEL: commercialBuildingCovLimit is %d", commercialBuildingCovLimit);
136-
message(true, msggloc1);
137-
string msggloc2 = strformat("LOCATION LEVEL: warehouseBuildingCovLimit is %d", warehouseBuildingCovLimit);
138-
message(true, msggloc2);
83+
int warehouseBuildingCovLimit = (commercialbuildingclass[Warehouse] > 0) ? commercialbuildingclass.maxWarehouseCovLimit : 0;
13984

14085
/* Set attribute value rule */
14186
constraint(City == "Boston" -> State == "MA", "State must be MA if City is set to Boston");
87+
constraint(City == "San Francisco" -> State == "CA", "State must be CA if City is set to San Francisco");
14288
}
14389

14490
type CommercialBuildingClass {
@@ -153,64 +99,42 @@ type CommercialBuildingClass {
15399
}
154100

155101
type Building : CommercialBuildingClass {
156-
@(closeRelation = true, propagateUp=true, sequence=2)
102+
@(closeRelation = true, propagateUp=true)
157103
relation commercialequipmentclass : CommercialEquipmentClass[0..20] {
158104
equipMakeLawnMowerCount = count(Equipment_Make == "Lawnmower");
159105
equipMakeFridgeCount = count(Equipment_Make == "Refrigerator");
160106
equipGoodConditionCount = count(Equipment_Condition == "Good");
161107
equipValueSum = sum(Equipment_Value);
162108
}
163109

164-
@(closeRelation=true, propagateUp=true, sequence=1)
165-
relation burglarycoverage : BurglaryCoverage[1];
110+
@(closeRelation=truee)
111+
relation burglarycoverage : BurglaryCoverage[0..1];
166112

167-
@(closeRelation=true,sequence=3)
113+
@(closeRelation=true)
168114
relation vandalismcoverage : VandalismCoverage[0..1];
169115

170116
string parentLocationProdState = parent(locationProdState);
171117
string parentLocationState = parent(State);
172118
int genLiabilityLimit = parent(genLimit);
173-
174-
// string msgg1 = strformat("parentLocationProdState is %s", parentLocationProdState);
175-
// message(true, msgg1);
176-
// string msgg2 = strformat("parentLocationState is %s", parentLocationState);
177-
// message(true, msgg2);
178-
179-
// REVISIT - CML EDITOR suddenly not liking burglarycoverage[BurglaryCoverage].Burglary_Limit notation
180-
@(nullAssignable=true)
119+
181120
int commercialBurglaryCovLimit = (burglarycoverage[BurglaryCoverage] > 0) ? burglarycoverage.Burglary_Limit : 0;
182-
// REVISIT - CML EDITOR suddenly not liking commercialequipmentclass[Equipment].equipValueSum notation, is accepting either commercialequipmentclass[CommercialEquipmentClass].equipValueSum or commercialequipmentclass.equipValueSum
183-
@(nullAssignable=true)
184121
int buildingEquipValSum = (commercialequipmentclass[Equipment] > 0) ? commercialequipmentclass.equipValueSum : 0;
185-
186-
// int buildingEquipValSum = (commercialequipmentclass.equipValueSum != null) ? commercialequipmentclass.equipValueSum : 0;
187-
188-
// int buildingEquipValSum = (commercialequipmentclass[Equipment] > 0) ? commercialequipmentclass.equipValueSum : 0;
189-
190-
@(nullAssignable=true)
191122
int buildEquipGoodConditionCount = (commercialequipmentclass[Equipment] > 0) ? commercialequipmentclass.equipGoodConditionCount : 0;
192123

193-
// int buildEquipValueMinInt = commercialequipmentclass.equipValueMin;
194124
boolean equipmentGoodBuildingAgeCondition = buildEquipGoodConditionCount > 0 && Building_Age == 6;
195-
rule(equipmentGoodBuildingAgeCondition == true, "hide", "attribute", "Sprinklers");
196-
message(equipmentGoodBuildingAgeCondition == true, "Hide sprinklers when equipment condition is good and building age is 6");
197-
198-
constraint((UserProfile == "Standard User" && parentLocationProdState != "FL" && commercialequipmentclass.equipMakeLawnMowerCount > 0) -> Sprinklers == "No", "Building should have no sprinkler if Standard User, Location State is not FL, and an Equipment is Lawnmower");
199-
200-
constraint((UserProfile == "Custom Partner Community User" && parentLocationState != "CA" && commercialequipmentclass.equipMakeFridgeCount > 0) -> Sprinklers == "Yes", "Building should have sprinklers if Partner Community User, Location State is not CA, and Equipment Class Make is Refrigerator");
125+
rule(buildEquipGoodConditionCount > 0 && Building_Age == 6, "hide", "attribute", "Sprinklers");
201126
}
202127

203128
type Warehouse : CommercialBuildingClass {
204-
@(closeRelation = true, propagateUp=true, sequence=1)
129+
@(closeRelation = true, propagateUp=true)
205130
relation warehousecommercialequipmentclass : CommercialEquipmentClass[0..20];
206131

207-
@(closeRelation=true, propagateUp=true,sequence = 2)
208-
relation warehouseburglarycoverage : BurglaryCoverage[1];
132+
@(closeRelation=true, propagateUp=true)
133+
relation warehouseburglarycoverage : BurglaryCoverage[0..1];
209134

210135
@(closeRelation=true,sequence = 3)
211136
relation warehousevandalismcoverage : VandalismCoverage[0..1];
212137

213-
// REVISIT - CML EDITOR suddenly not liking warehouseburglarycoverage[BurglaryCoverage].Burglary_Limit NOTATION
214138
int warehouseBurglaryCovLimit = warehouseburglarycoverage.Burglary_Limit;
215139
}
216140

@@ -235,69 +159,43 @@ type BurglaryCoverage {
235159
@(domainComputation = "false", defaultValue = "10000")
236160
int Burglary_Limit = [1000, 2000, 5000, 10000, 25000, 50000];
237161

238-
//, sequence=3
239162
@(domainComputation = "false", defaultValue = "100")
240163
int Burglary_Deductible = [0, 50, 100, 200, 500];
241164
}
242165

243-
type VandalismCoverage;
166+
type VandalismCoverage {
167+
@(domainComputation = "false", defaultValue = "10000")
168+
int Vandalism_Limit = [1000, 2000, 5000, 10000, 25000, 50000];
244169

245-
type Equipment : CommercialEquipmentClass {
170+
@(domainComputation = "false", defaultValue = "100")
171+
int Vandalism_Deductible = [0, 50, 100, 200, 500];
172+
}
246173

174+
type Equipment : CommercialEquipmentClass {
247175
string parentLocationStateEquip = parent(State);
248176
int rootCovLimit = parent(generalLiabilityLimit);
249177
int parentCommBuildCovLimit = parent(commercialBurglaryCovLimit);
250178
int rootGenLiability= parent(genLiabilityLimit);
251179
int parentBuildingAge = parent(Building_Age);
252180

253-
@(sequence = 3)
254181
relation equipmentcoverage : EquipmentCoverage[0..1];
255182

256-
// string msgg4 = strformat("parentLocationStateEquip is %s", parentLocationStateEquip);
257-
// message(true, msgg4);
258-
// string msgg3 = strformat("rootCovLimit is %d", rootCovLimit);
259-
// message(true, msgg3);
260-
// string msgg2 = strformat("parentCommBuildCovLimit is %d", parentCommBuildCovLimit);
261-
// message(true, msgg2);
262-
// string msgg5 = strformat("parentBuildingAge is %d", parentBuildingAge);
263-
// message(true, msgg5);
264-
265-
/* Rule: Add Equipment Coverage and set Limit to 50000 if root coverage limit is less than 2,000,000, parent location State is not NY, parent building Burglary coverage limit is less than 50,000, and equipment value is greater than 100,000 */
266-
// boolean ruleCondition = parentLocationStateEquip != "NY" && parentCommBuildCovLimit < 50000 && Equipment_Value > 100000 && rootCovLimit < 2000000;
267-
//boolean ruleCondition = parentLocationStateEquip != "NY" && Equipment_Value > 100000 ;
268-
269-
/* Remove equipment coverage if equipment condition is good, user is CC user and parent building age is 6 */
270-
// add back later: && UserProfile == "Custom Community Plus User"
271-
272-
// conditionGood + ageis6 -> exclude equipment coverage
273-
// if quipVal > 100000 + root coverage limit < 2000000 -> add equipment coverage
274-
// conditionGood + ageis6 -> require root coverage, limit = 50000
275-
276183
rule(Equipment_Condition == "Good" && parentBuildingAge == 6, "hide", "attribute", "Equipment_Condition", "value", "New");
277184

278-
/* Bottom-up rule: Hide Equipment condition option New if Equipment condition is Good and parent building age is 6 */
279-
280185
require(parentLocationStateEquip != "NY" && parentCommBuildCovLimit < 50000 && Equipment_Value > 100000 && rootCovLimit < 2000000
281-
, equipmentcoverage[EquipmentCoverage]{Equipment_Limit = 50000}, "Add EquipmentCoverage when location is not NY, commercial building cov limit is lt 50000, equipment value > 100,000");
282-
283-
//constraint(ruleCondition == true -> equipmentcoverage[EquipmentCoverage].Equipment_Limit == 50000, "Set equipment cov limit to 50,000");
284-
//message(ruleCondition == true, "Equipment coverage is added");
285-
//message(ruleCondition == true && equipmentcoverage[EquipmentCoverage] > 0, "Equipment coverage is set to 50000");
286-
287-
message(true, "EQUIPMENT LEVEL: UserProfile is %s", UserProfile);
288-
message(true, "EQUIPMENT LEVEL: parentLocationStateEquip is %s", parentLocationStateEquip);
289-
message(true, "EQUIPMENT LEVEL: Equipment_Condition is %s", Equipment_Condition);
290-
message(true, "EQUIPMENT LEVEL: parentBuildingAge is %s", parentBuildingAge);
186+
, equipmentcoverage[EquipmentCoverage], "Add EquipmentCoverage when location is not NY, commercial building cov limit is lt 50000, equipment value > 100,000");
187+
188+
constraint(parentLocationStateEquip != "NY" && parentCommBuildCovLimit < 50000 && Equipment_Value > 100000 && rootCovLimit < 2000000 && equipmentcoverage[EquipmentCoverage] > 0 -> equipmentcoverage[EquipmentCoverage].Equipment_Limit == 50000);
291189

292190
exclude(UserProfile == "System Administrator" && parentLocationStateEquip == "NY" && Equipment_Condition == "Good" && parentBuildingAge == 6, equipmentcoverage[EquipmentCoverage], "Please remove the Equipment Coverage due to Equipment Condition = Good and Building Age = 6 when profile is community user");
293-
message(Equipment_Condition == "Good" && parentBuildingAge == 6, "Removed Equipment Coverage due to Equipment Condition = Good and Building Age = 6 when profile is community user");
294191
}
295192

296193
type EquipmentCoverage {
297194
@(domainComputation = "false", defaultValue = "10000")
298195
int Equipment_Limit = [1000, 2000, 5000, 10000, 25000, 50000];
299196

300-
//, sequence=6
301197
@(domainComputation = "false", defaultValue = "100")
302198
int Equipment_Deductible = [0, 50, 100, 200, 500];
303-
}
199+
}
200+
201+

0 commit comments

Comments
 (0)