pavement_condition_index 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,568 @@
1
+ # generate this whole file by running the following command:
2
+ # rake regression:generate_calculated_deduct_coefficients_file > lib/pavement_condition_index/lookups/calculated_deduct_coefficients.rb
3
+
4
+ module PavementConditionIndex
5
+ module Lookups
6
+ class CalculatedDeductCoefficients
7
+
8
+ # Output of `rake regression:generate_deduct_coefficients`
9
+ COEFFICIENTS =
10
+ {:asphalt=>
11
+ {:alligator_cracking=>
12
+ {:valid_min=>0.1,
13
+ :valid_max=>100.0,
14
+ :chart_type=>:log,
15
+ :coefficients=>
16
+ {:low=>[11.81030706543641, 14.716555458137659, 5.254969146645571],
17
+ :medium=>[21.641468980402742, 19.850106754347717, 4.129291159183641],
18
+ :high=>
19
+ [30.698348853111792,
20
+ 26.819142548270502,
21
+ 5.653897800825902,
22
+ -2.0562458038186975]}},
23
+ :bleeding=>
24
+ {:valid_min=>0.1,
25
+ :valid_max=>100.0,
26
+ :chart_type=>:log,
27
+ :coefficients=>
28
+ {:low=>
29
+ [0.322105531453021,
30
+ -0.174525478036764,
31
+ 1.504981533364469,
32
+ 1.7947851128512355],
33
+ :medium=>
34
+ [3.3241213258799234,
35
+ 4.4914393599717854,
36
+ 3.3913394399693146,
37
+ 1.7791635264801178],
38
+ :high=>
39
+ [5.739963736596728,
40
+ 7.319479502282341,
41
+ 7.086578195546586,
42
+ 3.075398183100246]}},
43
+ :block_cracking=>
44
+ {:valid_min=>0.1,
45
+ :valid_max=>100.0,
46
+ :chart_type=>:log,
47
+ :coefficients=>
48
+ {:low=>[-0.24506618985589634, 3.5865225127793514, 4.864809264954378],
49
+ :medium=>[2.0044867717721253, 7.656841349922775, 6.197308536458376],
50
+ :high=>[6.054836363905478, 14.23908143225682, 9.26078972426816]}},
51
+ :bumps_and_sags=>
52
+ {:valid_min=>0.1,
53
+ :valid_max=>10.0,
54
+ :chart_type=>:log,
55
+ :coefficients=>
56
+ {:low=>
57
+ [7.432162927047138,
58
+ 13.039704473951343,
59
+ 12.681378093050206,
60
+ 5.724727901683913],
61
+ :medium=>
62
+ [24.0510616920146,
63
+ 24.990801854094467,
64
+ 17.775330890078287,
65
+ 10.801916366371941],
66
+ :high=>[53.60256635094115, 38.448582442650476, 6.043250542072165]}},
67
+ :corrugation=>
68
+ {:valid_min=>0.1,
69
+ :valid_max=>100.0,
70
+ :chart_type=>:log,
71
+ :coefficients=>
72
+ {:low=>[2.079645270606063, 6.171432244797827, 6.315591279321682],
73
+ :medium=>[16.00629930412681, 17.42721794385406, 5.877793175640937],
74
+ :high=>[33.3926340071105, 25.16870941731629, 2.8124490453717783]}},
75
+ :depression=>
76
+ {:valid_min=>0.1,
77
+ :valid_max=>100.0,
78
+ :chart_type=>:log,
79
+ :coefficients=>
80
+ {:low=>
81
+ [3.289661412212115,
82
+ 0.6252836980242593,
83
+ 10.964451357494776,
84
+ 6.985101871322738,
85
+ -3.5060456381316634],
86
+ :medium=>
87
+ [7.614400618717246,
88
+ 3.769091495110122,
89
+ 15.559272647446328,
90
+ 7.4759184063961435,
91
+ -4.844857281255507],
92
+ :high=>
93
+ [15.948684201140967,
94
+ 9.394030228694518,
95
+ 15.510038701741792,
96
+ 6.024061067798476,
97
+ -4.422031207577385]}},
98
+ :edge_cracking=>
99
+ {:valid_min=>0.1,
100
+ :valid_max=>20.0,
101
+ :chart_type=>:log,
102
+ :coefficients=>
103
+ {:low=>[3.211409886900335, 4.962171357579026, 2.4025247047022504],
104
+ :medium=>[9.38292671744566, 9.608124129013511, 4.3396040463768015],
105
+ :high=>[15.664668848033116, 15.377839697997818, 7.293639747414968]}},
106
+ :joint_reflection_cracking=>
107
+ {:valid_min=>0.1,
108
+ :valid_max=>30.0,
109
+ :chart_type=>:log,
110
+ :coefficients=>
111
+ {:low=>[2.599637864741199, 7.548320214895041, 6.035620574755107],
112
+ :medium=>
113
+ [7.381829148226155,
114
+ 13.409513965059839,
115
+ 14.487037415701224,
116
+ 2.604980254156252,
117
+ -4.850878879939305],
118
+ :high=>
119
+ [15.708313735606989,
120
+ 21.751135896400438,
121
+ 22.35224402708013,
122
+ 12.321810537440612,
123
+ -6.404620335343928,
124
+ -4.635950974262599]}},
125
+ :lane_shoulder_drop_off=>
126
+ {:valid_min=>0.5,
127
+ :valid_max=>15.0,
128
+ :chart_type=>:log,
129
+ :coefficients=>
130
+ {:low=>[1.7330434661503789, 2.2479876898054147, 8.492414136167602],
131
+ :medium=>[3.1018055744999637, 0.9748217115112947, 15.880585262031168],
132
+ :high=>[5.588313880268777, 5.140183474398842, 22.853461108687]}},
133
+ :longitudinal_transverse_cracking=>
134
+ {:valid_min=>0.1,
135
+ :valid_max=>30.0,
136
+ :chart_type=>:log,
137
+ :coefficients=>
138
+ {:low=>[2.1831950830355784, 8.216281290902756, 6.454535216997481],
139
+ :medium=>[8.67907975505781, 15.31510859022643, 6.266899017617167],
140
+ :high=>
141
+ [17.723256518500968,
142
+ 24.494224894065376,
143
+ 19.119102009732657,
144
+ 4.182799471044728,
145
+ -4.54528270804704]}},
146
+ :patching_and_utility_cut_patching=>
147
+ {:valid_min=>0.1,
148
+ :valid_max=>50.0,
149
+ :chart_type=>:log,
150
+ :coefficients=>
151
+ {:low=>[1.8384973325128793, 7.632382033226324, 6.507032451977727],
152
+ :medium=>[8.929258996532853, 14.056348057074333, 8.632199015982204],
153
+ :high=>
154
+ [18.05379050800971,
155
+ 18.570848940912526,
156
+ 15.195881745184764,
157
+ 4.634730303593308,
158
+ -4.282412070934171]}},
159
+ :polished_aggregate=>
160
+ {:valid_min=>0.1,
161
+ :valid_max=>100.0,
162
+ :chart_type=>:log,
163
+ :coefficients=>
164
+ {:low=>
165
+ [0.16789523734739448,
166
+ -0.1540196727901293,
167
+ 1.3119789947979732,
168
+ 1.8893029190226103],
169
+ :medium=>
170
+ [0.16789523734739448,
171
+ -0.1540196727901293,
172
+ 1.3119789947979732,
173
+ 1.8893029190226103],
174
+ :high=>
175
+ [0.16789523734739448,
176
+ -0.1540196727901293,
177
+ 1.3119789947979732,
178
+ 1.8893029190226103]}},
179
+ :potholes=>
180
+ {:valid_min=>0.01,
181
+ :valid_max=>10.0,
182
+ :chart_type=>:log,
183
+ :coefficients=>
184
+ {:low=>
185
+ [58.574736886209024,
186
+ 41.33443795417745,
187
+ 2.307796828048822,
188
+ -2.1009955078236295],
189
+ :medium=>
190
+ [91.64010353001909,
191
+ 65.40209466565399,
192
+ 5.262639941411422,
193
+ -3.0315939096971647],
194
+ :high=>
195
+ [109.3323221736685,
196
+ 56.29275767507379,
197
+ -0.3934988005267144,
198
+ -3.0772594822340906]}},
199
+ :railroad_crossing=>
200
+ {:valid_min=>1.0,
201
+ :valid_max=>40.0,
202
+ :chart_type=>:log,
203
+ :coefficients=>
204
+ {:low=>[0.5029257285845483, 5.749904110236876, 3.9821246564884927],
205
+ :medium=>
206
+ [5.254000147362391,
207
+ 11.422544085878982,
208
+ 37.11519773645627,
209
+ -16.910805393020667],
210
+ :high=>
211
+ [19.340445737998966,
212
+ 18.23862361469355,
213
+ 53.47893872454435,
214
+ -25.833753655092053]}},
215
+ :raveling=>
216
+ {:valid_min=>0.1,
217
+ :valid_max=>100.0,
218
+ :chart_type=>:log,
219
+ :coefficients=>
220
+ {:low=>[1.3364599508023929, 2.5381741896122354, 2.2521180739800015],
221
+ :medium=>
222
+ [8.547489838241672,
223
+ 5.50999488268751,
224
+ 2.8976928296955693,
225
+ 1.6574499250743635],
226
+ :high=>
227
+ [15.287212880590612,
228
+ 12.713212203226831,
229
+ 11.470876324575428,
230
+ 5.038585870016526,
231
+ -3.053732169374685]}},
232
+ :rutting=>
233
+ {:valid_min=>0.1,
234
+ :valid_max=>100.0,
235
+ :chart_type=>:log,
236
+ :coefficients=>
237
+ {:low=>
238
+ [7.166892989037484,
239
+ 15.480212329682374,
240
+ 7.204541988003889,
241
+ -2.056356612335577],
242
+ :medium=>
243
+ [17.07939650585985,
244
+ 23.042120387468632,
245
+ 7.267187817332259,
246
+ -2.992255156045317],
247
+ :high=>
248
+ [26.55168225206831,
249
+ 25.25096737467123,
250
+ 9.616695504985966,
251
+ 2.709242740203141,
252
+ -2.9515698599184823]}},
253
+ :shoving=>
254
+ {:valid_min=>0.1,
255
+ :valid_max=>50.0,
256
+ :chart_type=>:log,
257
+ :coefficients=>
258
+ {:low=>[4.413031420403843, 10.016571238629226, 5.535372489599174],
259
+ :medium=>[9.294794348392088, 16.13985140155734, 10.13135831372187],
260
+ :high=>
261
+ [17.76171628163815,
262
+ 19.396982653439373,
263
+ 15.785981300450224,
264
+ 3.016185582467493,
265
+ -3.721051791249142]}},
266
+ :slippage_cracking=>
267
+ {:valid_min=>0.1,
268
+ :valid_max=>100.0,
269
+ :chart_type=>:log,
270
+ :coefficients=>
271
+ {:low=>
272
+ [4.248092940884805,
273
+ 14.667313248550373,
274
+ 9.293396804566436,
275
+ -2.1419610585945215],
276
+ :medium=>
277
+ [10.838179259718574,
278
+ 20.247013730206078,
279
+ 13.130140952344512,
280
+ -0.24505223183555103,
281
+ -2.039447457156605],
282
+ :high=>
283
+ [17.75416989366112,
284
+ 32.470845743485654,
285
+ 29.87775942697452,
286
+ -5.259819524132407,
287
+ -13.039225691175872,
288
+ 4.346079607761759]}},
289
+ :swell=>
290
+ {:valid_min=>1.0,
291
+ :valid_max=>30.0,
292
+ :chart_type=>:log,
293
+ :coefficients=>
294
+ {:low=>[0.2776553410390519, 12.183535319307815],
295
+ :medium=>[9.7262404794108, 26.04919313918952],
296
+ :high=>[33.021164499056795, 9.27090451459351, 10.656396250845475]}},
297
+ :weathering=>
298
+ {:valid_min=>0.1,
299
+ :valid_max=>100.0,
300
+ :chart_type=>:log,
301
+ :coefficients=>
302
+ {:low=>[1.3364599508023929, 2.5381741896122354, 2.2521180739800015],
303
+ :medium=>
304
+ [8.547489838241672,
305
+ 5.50999488268751,
306
+ 2.8976928296955693,
307
+ 1.6574499250743635],
308
+ :high=>
309
+ [15.287212880590612,
310
+ 12.713212203226831,
311
+ 11.470876324575428,
312
+ 5.038585870016526,
313
+ -3.053732169374685]}}},
314
+ :concrete=>
315
+ {:blow_ups=>
316
+ {:valid_min=>0.0,
317
+ :valid_max=>100.0,
318
+ :chart_type=>:linear,
319
+ :coefficients=>
320
+ {:low=>
321
+ [-0.13356643356627984, 0.9327226107226047, -0.0049254079254079045],
322
+ :medium=>
323
+ [2.4678321678324604, 1.7452051282051162, -0.009509324009323961],
324
+ :high=>
325
+ [16.460695189802276,
326
+ 6.6234309223033865,
327
+ -0.32266835566470364,
328
+ 0.00886184309861393,
329
+ -0.00012927981986135247,
330
+ 9.488216405626576e-07,
331
+ -2.75408495568297e-09]}},
332
+ :durability_cracking=>
333
+ {:valid_min=>0.0,
334
+ :valid_max=>100.0,
335
+ :chart_type=>:linear,
336
+ :coefficients=>
337
+ {:low=>[-0.4342657342656646, 0.4144662004661978, -0.0018228438228438133],
338
+ :medium=>
339
+ [1.162237762237912, 0.8913053613053554, -0.0047948717948717735],
340
+ :high=>
341
+ [1.078321678321716,
342
+ 2.3633139083138457,
343
+ -0.030009906759907102,
344
+ 0.00013358585858586812]}},
345
+ :corner_break=>
346
+ {:valid_min=>0.0,
347
+ :valid_max=>100.0,
348
+ :chart_type=>:linear,
349
+ :coefficients=>
350
+ {:low=>[-0.3293706293704677, 0.9791701631701566, -0.004722610722610701],
351
+ :medium=>
352
+ [-0.2783216783214355,
353
+ 1.7891647241646425,
354
+ -0.018065268065267835,
355
+ 6.592851592852108e-05],
356
+ :high=>
357
+ [1.288811188811378,
358
+ 2.4348756798755913,
359
+ -0.027701631701631733,
360
+ 0.00011231546231547056]}},
361
+ :faulting=>
362
+ {:valid_min=>0.0,
363
+ :valid_max=>100.0,
364
+ :chart_type=>:linear,
365
+ :coefficients=>
366
+ {:low=>
367
+ [-0.3461538461541296,
368
+ 0.1409790209795434,
369
+ 0.017863053613043127,
370
+ -0.00030944055944033804,
371
+ 1.4743589743585815e-06],
372
+ :medium=>
373
+ [-0.41468531468475955,
374
+ 0.8501670551669466,
375
+ 0.00022144522144634804,
376
+ -3.360528360528539e-05],
377
+ :high=>
378
+ [0.3237762237764841, 1.5706270396270294, -0.007441724941724908]}},
379
+ :divided_slab=>
380
+ {:valid_min=>0.0,
381
+ :valid_max=>100.0,
382
+ :chart_type=>:linear,
383
+ :coefficients=>
384
+ {:low=>[0.05061547720434412, 1.0602363029053457, -0.005630494431710011],
385
+ :medium=>
386
+ [0.03647951619436718,
387
+ 3.3746231782018343,
388
+ -0.1114761630583947,
389
+ 0.0021410940640768225,
390
+ -1.957710432519595e-05,
391
+ 6.694382078015655e-08],
392
+ :high=>
393
+ [0.46219912502630667,
394
+ 3.7822323563200992,
395
+ -0.07844357814094624,
396
+ 0.000796815874702947,
397
+ -2.9932729934080204e-06]}},
398
+ :joint_seal_damage=>
399
+ {:valid_min=>0.0,
400
+ :valid_max=>100.0,
401
+ :chart_type=>:linear,
402
+ :coefficients=>
403
+ {:low=>[1.9999999999999998, 1.734723475976807e-17],
404
+ :medium=>[3.9999999999999996, 3.469446951953614e-17],
405
+ :high=>[7.999999999999999, 6.938893903907228e-17]}},
406
+ :lane_shoulder_drop_off=>
407
+ {:valid_min=>0.0,
408
+ :valid_max=>100.0,
409
+ :chart_type=>:linear,
410
+ :coefficients=>
411
+ {:low=>[0.8045454545454546, 0.05318181818181822],
412
+ :medium=>[1.0020979020979717, 0.412799533799531, -0.002383449883449871],
413
+ :high=>
414
+ [1.5426573426574572, 0.6763379953379907, -0.003817016317016299]}},
415
+ :patching_small=>
416
+ {:valid_min=>0.0,
417
+ :valid_max=>100.0,
418
+ :chart_type=>:linear,
419
+ :coefficients=>
420
+ {:low=>[0.290909090909091, 0.04890909090909093],
421
+ :medium=>
422
+ [-0.9902097902097355, 0.3280745920745899, -0.0015571095571095491],
423
+ :high=>
424
+ [-0.0433566433565602, 0.5040722610722577, -0.002474358974358961]}},
425
+ :linear_cracking=>
426
+ {:valid_min=>0.0,
427
+ :valid_max=>100.0,
428
+ :chart_type=>:linear,
429
+ :coefficients=>
430
+ {:low=>[0.5398601398602301, 0.540675990675987, -0.003179487179487164],
431
+ :medium=>
432
+ [1.3741258741259887, 0.6791188811188766, -0.0031748251748251613],
433
+ :high=>
434
+ [0.42867132866409063,
435
+ 2.1563908313932947,
436
+ -0.044027972028047216,
437
+ 0.00047105672105791094,
438
+ -1.8181818181858345e-06]}},
439
+ :polished_aggregate=>
440
+ {:valid_min=>0.0,
441
+ :valid_max=>100.0,
442
+ :chart_type=>:linear,
443
+ :coefficients=>
444
+ {:low=>[1.6272727272727279, 0.09527272727272733],
445
+ :medium=>[1.6272727272727279, 0.09527272727272733],
446
+ :high=>[1.6272727272727279, 0.09527272727272733]}},
447
+ :patching_large_and_utility_cuts=>
448
+ {:valid_min=>0.0,
449
+ :valid_max=>100.0,
450
+ :chart_type=>:linear,
451
+ :coefficients=>
452
+ {:low=>[-1.3692307692306875, 0.4911305361305329, -0.001952214452214441],
453
+ :medium=>
454
+ [-1.6265734265732865, 0.8520745920745864, -0.003466200466200449],
455
+ :high=>
456
+ [0.31328671328703894,
457
+ 1.736814296814201,
458
+ -0.017210372960372575,
459
+ 7.107614607615057e-05]}},
460
+ :popouts=>
461
+ {:valid_min=>0.0,
462
+ :valid_max=>100.0,
463
+ :chart_type=>:linear,
464
+ :coefficients=>
465
+ {:low=>[0.959090909090909, 0.163909090909091],
466
+ :medium=>[0.959090909090909, 0.163909090909091],
467
+ :high=>[0.959090909090909, 0.163909090909091]}},
468
+ :pumping=>
469
+ {:valid_min=>0.0,
470
+ :valid_max=>100.0,
471
+ :chart_type=>:linear,
472
+ :coefficients=>
473
+ {:low=>
474
+ [-0.21048951048939823, 0.6700326340326295, -0.0028857808857808715],
475
+ :medium=>
476
+ [-0.21048951048939823, 0.6700326340326295, -0.0028857808857808715],
477
+ :high=>
478
+ [-0.21048951048939823, 0.6700326340326295, -0.0028857808857808715]}},
479
+ :punchouts=>
480
+ {:valid_min=>0.0,
481
+ :valid_max=>100.0,
482
+ :chart_type=>:linear,
483
+ :coefficients=>
484
+ {:low=>
485
+ [0.23916083916105269,
486
+ 1.5800194250193544,
487
+ -0.015674825174824977,
488
+ 5.3302253302257776e-05],
489
+ :medium=>
490
+ [0.39300699299788633,
491
+ 2.807282439785469,
492
+ -0.05446882284391663,
493
+ 0.0005626068376083245,
494
+ -2.281468531473641e-06],
495
+ :high=>
496
+ [0.41538461537338645,
497
+ 3.5455419580456358,
498
+ -0.07212266899778302,
499
+ 0.0007346736596754574,
500
+ -2.8175990676052593e-06]}},
501
+ :railroad_crossing=>
502
+ {:valid_min=>0.0,
503
+ :valid_max=>60.0,
504
+ :chart_type=>:linear,
505
+ :coefficients=>
506
+ {:low=>[0.6833333333333371, 0.8607142857142842, -0.006476190476190441],
507
+ :medium=>
508
+ [0.1285714285707984,
509
+ 2.2037301587302798,
510
+ -0.04358333333333836,
511
+ 0.0003472222222222999],
512
+ :high=>
513
+ [0.33809523809302156,
514
+ 8.013373015879024,
515
+ -0.3216250000004167,
516
+ 0.005897222222234228,
517
+ -3.8750000000108535e-05]}},
518
+ :scaling_map_cracking_crazing=>
519
+ {:valid_min=>0.0,
520
+ :valid_max=>100.0,
521
+ :chart_type=>:linear,
522
+ :coefficients=>
523
+ {:low=>[-0.06853146853142666, 0.248659673659672, -0.001327505827505821],
524
+ :medium=>
525
+ [0.46013986013996666,
526
+ 0.8226573426573058,
527
+ -0.008888694638694558,
528
+ 3.712121212121473e-05],
529
+ :high=>
530
+ [0.29160839160132745,
531
+ 2.0888636363660593,
532
+ -0.04204050116557495,
533
+ 0.00045110722610839597,
534
+ -1.7511655011694358e-06]}},
535
+ :shrinkage_cracks=>
536
+ {:valid_min=>0.0,
537
+ :valid_max=>100.0,
538
+ :chart_type=>:linear,
539
+ :coefficients=>
540
+ {:low=>[-0.17727272727272714, 0.045727272727272755],
541
+ :medium=>[-0.17727272727272714, 0.045727272727272755],
542
+ :high=>[-0.17727272727272714, 0.045727272727272755]}},
543
+ :spalling_corner=>
544
+ {:valid_min=>0.0,
545
+ :valid_max=>100.0,
546
+ :chart_type=>:linear,
547
+ :coefficients=>
548
+ {:low=>[0.5636363636363639, 0.16127272727272735],
549
+ :medium=>
550
+ [-1.039160839160767, 0.44085314685314403, -0.002013986013986005],
551
+ :high=>[0.945454545454647, 0.605181818181814, -0.003136363636363623]}},
552
+ :spalling_joint=>
553
+ {:valid_min=>0.0,
554
+ :valid_max=>100.0,
555
+ :chart_type=>:linear,
556
+ :coefficients=>
557
+ {:low=>
558
+ [-0.2825174825174346, 0.28762237762237564, -0.0015944055944055865],
559
+ :medium=>
560
+ [-0.09580419580411226, 0.5094778554778521, -0.0025547785547785406],
561
+ :high=>
562
+ [1.0006993006994707,
563
+ 1.482397047396983,
564
+ -0.016978438228438142,
565
+ 7.73698523698574e-05]}}}}
566
+ end
567
+ end
568
+ end
@@ -0,0 +1,23 @@
1
+ module PavementConditionIndex
2
+ module Lookups
3
+ class CorrectedDeductValues
4
+
5
+ def initialize(pavement_type:nil, q:nil)
6
+ @pavement_type = pavement_type
7
+ @q = "q#{q}".to_sym
8
+ end
9
+
10
+ def call(total_deduct_value)
11
+ coefficients = PavementConditionIndex::Lookups::CalculatedCorrectedDeductCoefficients::COEFFICIENTS[@pavement_type][:coefficients][@q]
12
+ total_deduct_value = total_deduct_value.clamp(0.0,200.0)
13
+ return evaluate_polynomial(*coefficients).call(total_deduct_value).clamp(0.0,100.0)
14
+ end
15
+
16
+ private
17
+
18
+ def evaluate_polynomial(*coefficients)
19
+ Proc.new {|x| coefficients.map.with_index{|c,i| c*(x**i)}.reduce(:+)}
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,27 @@
1
+ module PavementConditionIndex
2
+ module Lookups
3
+ class DeductValues
4
+
5
+ def initialize(pavement_type:nil,severity:nil,distress_type:nil)
6
+ @pavement_type = pavement_type
7
+ @severity = severity
8
+ @distress_type = distress_type
9
+ end
10
+
11
+ def call(value)
12
+ deduct = PavementConditionIndex::Lookups::CalculatedDeductCoefficients::COEFFICIENTS[@pavement_type][@distress_type]
13
+ coefficients = deduct[:coefficients][@severity]
14
+ value = value.clamp(deduct[:valid_min],deduct[:valid_max])
15
+ # Asphalt charts use logarithmic scale, concrete uses linear
16
+ value = deduct[:chart_type] == :log ? Math.log10(value.to_f) : value.to_f
17
+ return evaluate_polynomial(*coefficients).call(value).clamp(0.0,100.0)
18
+ end
19
+
20
+ private
21
+
22
+ def evaluate_polynomial(*coefficients)
23
+ Proc.new {|x| coefficients.map.with_index{|c,i| c*(x**i)}.reduce(:+)}
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,65 @@
1
+ module PavementConditionIndex
2
+ module Lookups
3
+ class ObservedCorrectedDeductValues
4
+
5
+ X_VALUES = [30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0, 180.0, 190.0, 200.0]
6
+
7
+ # The reference charts do not actually include these lines,
8
+ # so this is what we think they would be.
9
+ # How the interpolated values were determined [concrete: q5, q7, q8]:
10
+ # Average (or weighted average) of the lines surrounding it.
11
+ # This should be a good estimate.
12
+ # How the extrapolated values were determined [asphalt: q8, q9, q10; concrete: q10]:
13
+ # Took the difference between the last two known, observed q-value arrays, and added that difference
14
+ # to the last known q-value array. (Asphalt Ex: q8 = q7 + (q7 - q6), q9 = q7 + 2(q7 - q6), etc.)
15
+ # This estimate may be less accurate.
16
+ ESTIMATED_VALUES = {
17
+ asphalt: {
18
+ q8: [6.1, 13.1, 19.8, 25.6, 31.7, 37.6, 43.0, 48.1, 53.3, 58.7, 63.1, 66.8, 69.8, 72.4, 73.1, 74.2, 74.6, 74.2],
19
+ q9: [6.1, 13.1, 19.8, 25.6, 31.7, 37.6, 43.0, 48.1, 53.3, 58.7, 63.1, 66.2, 68.3, 70.0, 69.0, 69.0, 68.1, 66.2],
20
+ q10: [6.1, 13.1, 19.8, 25.6, 31.7, 37.6, 43.0, 48.1, 53.3, 58.7, 63.1, 65.6, 66.8, 67.6, 64.9, 63.8, 61.6, 58.2]
21
+ },
22
+ concrete: {
23
+ q5: [14.6, 20.5, 26.1, 32.0, 37.6, 43.3, 48.7, 54.1, 59.2, 64.2, 68.8, 73.6, 77.9, 82.2, 86.2, 90.1, 94.0, 97.4],
24
+ q7: [10.9, 16.8, 22.5, 28.1, 33.3, 38.5, 43.8, 48.9, 53.9, 58.6, 63.2, 67.9, 72.1, 76.4, 80.1, 84.0, 87.6, 90.6],
25
+ q8: [9.5, 15.5, 21.2, 26.7, 31.9, 36.7, 41.6, 46.5, 51.5, 56.0, 60.5, 65.3, 69.4, 73.6, 77.5, 81.4, 84.8, 88.2],
26
+ q10: [6.5, 13.1, 18.8, 24.1, 28.9, 32.9, 37.0, 41.7, 46.7, 51.0, 55.1, 60.3, 64.0, 68.2, 72.1, 76.0, 79.2, 83.2]
27
+ }
28
+ }
29
+
30
+ OBSERVED_VALUES = {
31
+ asphalt: {
32
+ x_values: X_VALUES,
33
+ expected_y_values: {
34
+ q1: [30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0, 180.0, 190.0, 200.0],
35
+ q2: [21.9, 29.3, 36.9, 43.7, 50.4, 57.4, 63.7, 69.8, 75.4, 80.7, 85.6, 90.0, 93.9, 97.6, 101.3, 104.3, 106.7, 108.9],
36
+ q3: [16.7, 24.3, 31.1, 37.8, 44.8, 50.7, 56.9, 63.0, 68.3, 73.1, 78.3, 83.3, 88.0, 92.0, 96.3, 99.8, 103.0, 105.0],
37
+ q4: [12.4, 19.3, 26.3, 33.0, 39.4, 45.6, 51.1, 56.7, 62.4, 67.8, 73.1, 78.5, 82.8, 86.9, 90.4, 93.3, 95.9, 98.1],
38
+ q5: [9.3, 16.3, 22.8, 28.9, 35.2, 40.9, 46.7, 51.9, 57.0, 62.4, 67.2, 72.2, 76.7, 80.9, 84.8, 88.1, 91.1, 93.3],
39
+ q6: [6.1, 13.1, 19.8, 25.6, 31.7, 37.6, 43.0, 48.1, 53.3, 58.7, 63.1, 68.0, 72.8, 77.2, 81.3, 84.6, 87.6, 90.2],
40
+ q7: [6.1, 13.1, 19.8, 25.6, 31.7, 37.6, 43.0, 48.1, 53.3, 58.7, 63.1, 67.4, 71.3, 74.8, 77.2, 79.4, 81.1, 82.2],
41
+ q8: ESTIMATED_VALUES[:asphalt][:q8],
42
+ q9: ESTIMATED_VALUES[:asphalt][:q9],
43
+ q10: ESTIMATED_VALUES[:asphalt][:q10]
44
+ }
45
+ },
46
+ concrete: {
47
+ x_values: X_VALUES,
48
+ expected_y_values: {
49
+ q1: [30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0, 180.0, 190.0, 200.0],
50
+ q2: [24.8, 32.2, 39.1, 45.9, 51.7, 57.4, 63.3, 69.1, 75.0, 80.2, 85.7, 90.6, 95.2, 99.8, 104.1, 108.1, 111.7, 114.6],
51
+ q3: [18.7, 25.7, 32.0, 38.1, 44.4, 50.7, 56.5, 62.0, 67.4, 72.4, 77.6, 82.8, 88.0, 92.8, 97.4, 101.7, 105.6, 108.5],
52
+ q4: [16.7, 23.0, 28.5, 34.6, 40.4, 46.1, 51.3, 56.9, 62.0, 67.2, 71.7, 76.7, 80.9, 85.2, 89.6, 93.5, 97.6, 101.7],
53
+ q5: ESTIMATED_VALUES[:concrete][:q5],
54
+ q6: [12.4, 18.0, 23.7, 29.4, 34.8, 40.4, 46.1, 51.3, 56.3, 61.1, 65.9, 70.4, 74.8, 79.1, 82.8, 86.7, 90.4, 93.1],
55
+ q7: ESTIMATED_VALUES[:concrete][:q7],
56
+ q8: ESTIMATED_VALUES[:concrete][:q8],
57
+ q9: [8.0, 14.3, 20.0, 25.4, 30.4, 34.8, 39.3, 44.1, 49.1, 53.5, 57.8, 62.8, 66.7, 70.9, 74.8, 78.7, 82.0, 85.7],
58
+ q10: ESTIMATED_VALUES[:concrete][:q10]
59
+ }
60
+ }
61
+ }
62
+
63
+ end
64
+ end
65
+ end