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,121 @@
1
+ require 'pavement_condition_index/lookups/observed_deduct_values'
2
+ require 'pavement_condition_index/lookups/observed_corrected_deduct_values'
3
+ require 'pp'
4
+ require 'matrix'
5
+
6
+ namespace :regression do
7
+
8
+ task :generate_deduct_coefficients do
9
+ output = PavementConditionIndex::Lookups::ObservedDeductValues::OBSERVED_VALUES.map do |pavement_type_key,pavement_type_values|
10
+ remapped_pavement_type_values = pavement_type_values.map do |distress_type_key,distress_type_values|
11
+ coefficients = {low: nil, medium: nil, high: nil}.map do |severity_key,coefficient|
12
+ polynomial_degree = 0
13
+ @candidate_coefficients = []
14
+ @x_values = distress_type_values[:chart_type] == :log ? distress_type_values[:x_values].map {|x| Math.log10(x)} : distress_type_values[:x_values]
15
+ loop do
16
+ polynomial_degree += 1
17
+ @candidate_coefficients = regress_polynomial(@x_values,distress_type_values[:expected_y_values][severity_key],polynomial_degree)
18
+ candidate_y_values = @x_values.map {|x| evaluate_polynomial(*@candidate_coefficients).call(x) }
19
+ sum_of_squares = 0.0
20
+ distress_type_values[:x_values].each_with_index do |x, index|
21
+ sum_of_squares += (candidate_y_values[index] - distress_type_values[:expected_y_values][severity_key][index])**2
22
+ end
23
+ break if sum_of_squares < 10.0
24
+ end
25
+ [severity_key, @candidate_coefficients]
26
+ end.to_h
27
+ remapped_distress_type_values = {
28
+ valid_min: distress_type_values[:valid_min],
29
+ valid_max: distress_type_values[:valid_max],
30
+ chart_type: distress_type_values[:chart_type],
31
+ coefficients: coefficients
32
+ }
33
+ [distress_type_key,remapped_distress_type_values]
34
+ end.to_h
35
+ [pavement_type_key,remapped_pavement_type_values]
36
+ end.to_h
37
+ pp output
38
+ end
39
+
40
+ task :generate_corrected_deduct_coefficients do
41
+ output = PavementConditionIndex::Lookups::ObservedCorrectedDeductValues::OBSERVED_VALUES.map do |pavement_type_key,pavement_type_values|
42
+ coefficients = pavement_type_values[:expected_y_values].map do |q_value_key,observed_values|
43
+ polynomial_degree = 0
44
+ @candidate_coefficients = []
45
+ @x_values = pavement_type_values[:x_values]
46
+ loop do
47
+ polynomial_degree += 1
48
+ @candidate_coefficients = regress_polynomial(@x_values,observed_values,polynomial_degree)
49
+ candidate_y_values = @x_values.map {|x| evaluate_polynomial(*@candidate_coefficients).call(x) }
50
+ sum_of_squares = 0.0
51
+ pavement_type_values[:x_values].each_with_index do |x, index|
52
+ sum_of_squares += (candidate_y_values[index] - observed_values[index])**2
53
+ end
54
+ break if sum_of_squares < 10.0
55
+ end
56
+ [q_value_key, @candidate_coefficients]
57
+ end.to_h
58
+ remapped_pavement_type_values = {
59
+ coefficients: coefficients
60
+ }
61
+ [pavement_type_key,remapped_pavement_type_values]
62
+ end.to_h
63
+ pp output
64
+ end
65
+
66
+ task :generate_calculated_deduct_coefficients_file do
67
+ header =
68
+ "# generate this whole file by running the following command:\n"+
69
+ "# rake regression:generate_calculated_deduct_coefficients_file > lib/pavement_condition_index/lookups/calculated_deduct_coefficients.rb\n"+
70
+ "\n"+
71
+ "module PavementConditionIndex\n"+
72
+ " module Lookups\n"+
73
+ " class CalculatedDeductCoefficients\n"+
74
+ "\n"+
75
+ "# Output of `rake regression:generate_deduct_coefficients`\n"+
76
+ "COEFFICIENTS = "
77
+ puts header
78
+
79
+ Rake::Task["regression:generate_deduct_coefficients"].invoke
80
+
81
+ footer =
82
+ " end\n"+
83
+ " end\n"+
84
+ "end\n"
85
+ puts footer
86
+ end
87
+
88
+ task :generate_calculated_corrected_deduct_coefficients_file do
89
+ header =
90
+ "# generate this whole file by running the following command:\n"+
91
+ "# rake regression:generate_calculated_corrected_deduct_coefficients_file > lib/pavement_condition_index/lookups/calculated_corrected_deduct_coefficients.rb\n"+
92
+ "\n"+
93
+ "module PavementConditionIndex\n"+
94
+ " module Lookups\n"+
95
+ " class CalculatedCorrectedDeductCoefficients\n"+
96
+ "\n"+
97
+ "# Output of `rake regression:generate_corrected_deduct_coefficients`\n"+
98
+ "COEFFICIENTS = "
99
+ puts header
100
+
101
+ Rake::Task["regression:generate_corrected_deduct_coefficients"].invoke
102
+
103
+ footer =
104
+ " end\n"+
105
+ " end\n"+
106
+ "end\n"
107
+ puts footer
108
+ end
109
+ end
110
+
111
+ def regress_polynomial x, y, degree
112
+ rows = x.map do |i|
113
+ (0..degree).map { |power| (i ** power).to_f }
114
+ end
115
+ mx, my = Matrix.rows(rows), Matrix.columns([y])
116
+ ((mx.transpose * mx).inv * mx.transpose * my).transpose.row(0).to_a
117
+ end
118
+
119
+ def evaluate_polynomial(*coefficients)
120
+ Proc.new {|x| coefficients.map.with_index{|c,i| c*(x**i)}.reduce(:+)}
121
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "pavement_condition_index/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pavement_condition_index"
8
+ spec.version = PavementConditionIndex::VERSION
9
+ spec.authors = ["Andy Monroe", "Nate Clark"]
10
+ spec.email = ["hello@brandnewbox.com"]
11
+
12
+ spec.summary = %q{Summary}
13
+ spec.homepage = "https://github.com/brandnewbox/pavement_condition_index"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.15"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec", "~> 3.0"
24
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pavement_condition_index
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Andy Monroe
8
+ - Nate Clark
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2017-08-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.15'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.15'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '10.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '10.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.0'
56
+ description:
57
+ email:
58
+ - hello@brandnewbox.com
59
+ executables: []
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".travis.yml"
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - bin/console
71
+ - bin/setup
72
+ - lib/pavement_condition_index.rb
73
+ - lib/pavement_condition_index/cdv_iteration.rb
74
+ - lib/pavement_condition_index/core_ext/numeric.rb
75
+ - lib/pavement_condition_index/distress_group.rb
76
+ - lib/pavement_condition_index/lookups/calculated_corrected_deduct_coefficients.rb
77
+ - lib/pavement_condition_index/lookups/calculated_deduct_coefficients.rb
78
+ - lib/pavement_condition_index/lookups/corrected_deduct_values.rb
79
+ - lib/pavement_condition_index/lookups/deduct_values.rb
80
+ - lib/pavement_condition_index/lookups/observed_corrected_deduct_values.rb
81
+ - lib/pavement_condition_index/lookups/observed_deduct_values.rb
82
+ - lib/pavement_condition_index/pci.rb
83
+ - lib/pavement_condition_index/sample_unit_condition_survey/asphalt_survey.rb
84
+ - lib/pavement_condition_index/sample_unit_condition_survey/base_survey.rb
85
+ - lib/pavement_condition_index/sample_unit_condition_survey/concrete_survey.rb
86
+ - lib/pavement_condition_index/section_condition_survey.rb
87
+ - lib/pavement_condition_index/version.rb
88
+ - lib/tasks/regression.rake
89
+ - pavement_condition_index.gemspec
90
+ homepage: https://github.com/brandnewbox/pavement_condition_index
91
+ licenses:
92
+ - MIT
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.5.1
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: Summary
114
+ test_files: []