Class: GitFit::ElevationCLI

Inherits:
Thor
  • Object
show all
Defined in:
lib/git_fit/cli/elevation.rb

Instance Method Summary collapse

Instance Method Details

#backfill(source = nil) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/git_fit/cli/elevation.rb', line 16

def backfill(source = nil)
  config = git_fit_config
  conn = GitFit::DB::Connection.new(config.db_path)
  conn.migrate!
  db = conn.db

  result = GitFit::Elevation::Backfill.new(db, force: options[:force]).call(source)

  msg = "Elevation backfill: #{result[:updated]} updated, " \
        "#{result[:skipped]} skipped, #{result[:failed]} failed"
  say_status :done, msg, :green
rescue StandardError => e
  say_status :error, "Elevation backfill failed: #{e.message}", :red
end

#correct(source = nil) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/git_fit/cli/elevation.rb', line 36

def correct(source = nil)
  config = git_fit_config
  conn = GitFit::DB::Connection.new(config.db_path)
  conn.migrate!
  db = conn.db

  result = GitFit::Elevation::Correct.new(
    db,
    force: options[:force],
    dry_run: options[:'dry-run'],
    dem: options[:dem],
  ).call(source)

  msg = "Elevation correct: #{result[:updated]} updated, " \
        "#{result[:skipped]} skipped, #{result[:failed]} failed, " \
        "#{result[:no_model]} no_model"
  say_status :done, msg, :green
rescue StandardError => e
  say_status :error, "Elevation correct failed: #{e.message}", :red
end

#infer(gain_per_km, range_per_km, seg_density) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/git_fit/cli/elevation.rb', line 81

def infer(gain_per_km, range_per_km, seg_density)
  g = gain_per_km.to_f
  r = range_per_km.to_f
  s = seg_density.to_f

  m = GitFit::Elevation::TerrainCoeff.terrain_m(
    gain_per_km: g,
    range_per_km: r,
    seg_density: s,
  )
  h = GitFit::Elevation::TerrainCoeff.hysteresis_threshold(m)
  spacing = GitFit::Elevation::TerrainCoeff.dem_spacing(
    gain_per_km: g,
    range_per_km: r,
    seg_density: s,
  )

  say "terrain_M: #{format('%.3f', m)}"
  say "h_threshold: #{format('%.1f', h)}"
  say "dem_spacing: #{spacing}m"
rescue StandardError => e
  say_status :error, "Inference failed: #{e.message}", :red
  exit 1
end

#model_infoObject



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/git_fit/cli/elevation.rb', line 107

def model_info
  model = GitFit::Elevation::TerrainCoeff.model
  path = GitFit::Elevation::TerrainCoeff.model_path

  say "Model path: #{path}"
  say "n_samples: #{model['meta']['n_samples']}"
  say "trained_at: #{model['meta']['trained_at']}"
  say "sources: #{model['meta']['sources'].join(', ')}"
  say "ridge_h: #{model['ridge_h'].map { |w| format('%.4f', w) }.join(', ')}"
  say "norms: #{model['norms'].map { |n| format('%.4f', n) }.join(', ')}"
  say "pav_h entries: #{model['pav_h'].size}"
  say "lookup entries: #{model['lookup'].size}"
rescue StandardError => e
  say_status :error, "Failed to load model: #{e.message}", :red
  exit 1
end

#trainObject



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/git_fit/cli/elevation.rb', line 60

def train
  sources = options[:sources]&.split(',')&.map(&:strip)
  output = options[:output]

  say_status :info, 'Starting model training...', :green
  runner = GitFit::Elevation::Train::Runner.new(sources: sources, output: output)
  success = runner.run

  if success
    say_status :done, 'Training complete', :green
  else
    say_status :error, 'Training failed', :red
    exit 1
  end
rescue StandardError => e
  say_status :error, "Training failed: #{e.message}", :red
  say_status :error, e.backtrace.first(5).join("\n"), :red
  exit 1
end