Fix all 12 dialyzer warnings
- Replace MapSet with plain list + `in` (features.ex, scorer_diff.ex) - Remove undefined Beacon.t() type reference (range_estimate.ex) - Remove dead else branch in find_region (inversion.ex) - Handle Nx special values in to_float catch-all (recalibrator.ex) - Remove unreachable catch-all clauses (hrrr_native_client.ex, ncei_metar_client.ex) - Remove unnecessary nil guards on always-typed values (show.ex) - Remove dead sky_note/wind_note non-nil clauses (show.ex) - Remove dead if-guard on always-truthy derive result (hrrr_native_derive.ex) - Add @spec to path_integrated_conditions (scorer.ex)
This commit is contained in:
parent
623bb45aee
commit
1174ecd9e5
10 changed files with 39 additions and 67 deletions
|
|
@ -33,24 +33,23 @@ defmodule Microwaveprop.Backtest.Features do
|
||||||
and placeholder stubs that always return nil.
|
and placeholder stubs that always return nil.
|
||||||
"""
|
"""
|
||||||
def all_features do
|
def all_features do
|
||||||
excluded =
|
excluded = [
|
||||||
MapSet.new([
|
# 4-arity helper
|
||||||
# 4-arity helper
|
:duct_usable_for_band,
|
||||||
:duct_usable_for_band,
|
# Stubs (always nil)
|
||||||
# Stubs (always nil)
|
:distance_to_front,
|
||||||
:distance_to_front,
|
:parallel_to_front,
|
||||||
:parallel_to_front,
|
# Dead features — no discrimination in consolidated backtest (2026-04-11)
|
||||||
# Dead features — no discrimination in consolidated backtest (2026-04-11)
|
:duct_usable_10ghz,
|
||||||
:duct_usable_10ghz,
|
:duct_usable_24ghz,
|
||||||
:duct_usable_24ghz,
|
:duct_usable_47ghz,
|
||||||
:duct_usable_47ghz,
|
:bulk_richardson
|
||||||
:bulk_richardson
|
]
|
||||||
])
|
|
||||||
|
|
||||||
:functions
|
:functions
|
||||||
|> __MODULE__.__info__()
|
|> __MODULE__.__info__()
|
||||||
|> Enum.filter(fn {_name, arity} -> arity == 3 end)
|
|> Enum.filter(fn {_name, arity} -> arity == 3 end)
|
||||||
|> Enum.reject(fn {name, _} -> MapSet.member?(excluded, name) end)
|
|> Enum.reject(fn {name, _} -> name in excluded end)
|
||||||
|> Map.new(fn {name, _} ->
|
|> Map.new(fn {name, _} ->
|
||||||
{to_string(name), &apply(__MODULE__, name, [&1, &2, &3])}
|
{to_string(name), &apply(__MODULE__, name, [&1, &2, &3])}
|
||||||
end)
|
end)
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ defmodule Microwaveprop.Beacons.RangeEstimate do
|
||||||
points within range where the estimated received signal exceeds the
|
points within range where the estimated received signal exceeds the
|
||||||
detection floor.
|
detection floor.
|
||||||
"""
|
"""
|
||||||
@spec estimate(Microwaveprop.Beacons.Beacon.t()) :: map()
|
@spec estimate(struct()) :: map()
|
||||||
def estimate(beacon) do
|
def estimate(beacon) do
|
||||||
band_mhz = nearest_band_mhz(beacon.frequency_mhz)
|
band_mhz = nearest_band_mhz(beacon.frequency_mhz)
|
||||||
band_config = BandConfig.get(band_mhz)
|
band_config = BandConfig.get(band_mhz)
|
||||||
|
|
|
||||||
|
|
@ -65,21 +65,13 @@ defmodule Microwaveprop.Propagation.Inversion do
|
||||||
|
|
||||||
defp find_region([], _base), do: nil
|
defp find_region([], _base), do: nil
|
||||||
|
|
||||||
defp find_region([pair | rest], base) do
|
defp find_region([pair | rest], _base) do
|
||||||
[{{_h1, t1}, _i1}, {{_h2, t2}, i2}] = pair
|
[{{_h1, t1}, _i1}, {{_h2, t2}, i2}] = pair
|
||||||
|
|
||||||
if is_nil(base) do
|
if t2 > t1 do
|
||||||
if t2 > t1 do
|
find_region_top(rest, i2 - 1, i2)
|
||||||
find_region_top(rest, i2 - 1, i2)
|
|
||||||
else
|
|
||||||
find_region(rest, nil)
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
if t2 < t1 do
|
find_region(rest, nil)
|
||||||
{base, i2 - 1}
|
|
||||||
else
|
|
||||||
find_region(rest, base)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -311,5 +311,5 @@ defmodule Microwaveprop.Propagation.Recalibrator do
|
||||||
|
|
||||||
defp to_float(n) when is_float(n), do: n
|
defp to_float(n) when is_float(n), do: n
|
||||||
defp to_float(n) when is_integer(n), do: n * 1.0
|
defp to_float(n) when is_integer(n), do: n * 1.0
|
||||||
defp to_float(n), do: n * 1.0
|
defp to_float(_), do: 0.0
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -385,6 +385,7 @@ defmodule Microwaveprop.Propagation.Scorer do
|
||||||
- Other factors (temp, dewpoint, PWAT, BL depth): use path AVERAGE
|
- Other factors (temp, dewpoint, PWAT, BL depth): use path AVERAGE
|
||||||
- Time/season/sky: taken from first profile (same for entire path)
|
- Time/season/sky: taken from first profile (same for entire path)
|
||||||
"""
|
"""
|
||||||
|
@spec path_integrated_conditions([map()], map()) :: map() | nil
|
||||||
def path_integrated_conditions(profiles, contact) do
|
def path_integrated_conditions(profiles, contact) do
|
||||||
lon = Kernel.||(contact.pos1["lon"] || contact.pos1["lng"], -97.0)
|
lon = Kernel.||(contact.pos1["lon"] || contact.pos1["lng"], -97.0)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -242,8 +242,6 @@ defmodule Microwaveprop.Weather.HrrrNativeClient do
|
||||||
|> Enum.min(fn -> 0.0 end)
|
|> Enum.min(fn -> 0.0 end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp min_m_gradient(_), do: nil
|
|
||||||
|
|
||||||
defp max_duct_thickness([]), do: nil
|
defp max_duct_thickness([]), do: nil
|
||||||
defp max_duct_thickness(ducts), do: ducts |> Enum.map(& &1.thickness_m) |> Enum.max()
|
defp max_duct_thickness(ducts), do: ducts |> Enum.map(& &1.thickness_m) |> Enum.max()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -161,7 +161,6 @@ defmodule Microwaveprop.Weather.NceiMetarClient do
|
||||||
defp parse_metar_temp(s), do: String.to_integer(s) * 1.0
|
defp parse_metar_temp(s), do: String.to_integer(s) * 1.0
|
||||||
|
|
||||||
defp c_to_f(c) when is_number(c), do: c * 9.0 / 5.0 + 32.0
|
defp c_to_f(c) when is_number(c), do: c * 9.0 / 5.0 + 32.0
|
||||||
defp c_to_f(_), do: nil
|
|
||||||
|
|
||||||
defp extract_wind_speed(parts) do
|
defp extract_wind_speed(parts) do
|
||||||
with wind when is_binary(wind) <- Enum.find(parts, &Regex.match?(~r/^\d{3}\d{2,3}KT/, &1)),
|
with wind when is_binary(wind) <- Enum.find(parts, &Regex.match?(~r/^\d{3}\d{2,3}KT/, &1)),
|
||||||
|
|
|
||||||
|
|
@ -577,9 +577,13 @@ defmodule MicrowavepropWeb.ContactLive.Show do
|
||||||
|
|
||||||
<%= if @editing do %>
|
<%= if @editing do %>
|
||||||
<div class="bg-base-200 rounded-box p-4 mb-4">
|
<div class="bg-base-200 rounded-box p-4 mb-4">
|
||||||
<h3 class="font-semibold mb-3">{if admin?(assigns), do: "Edit Contact", else: "Suggest Edit"}</h3>
|
<h3 class="font-semibold mb-3">
|
||||||
|
{if admin?(assigns), do: "Edit Contact", else: "Suggest Edit"}
|
||||||
|
</h3>
|
||||||
<p class="text-sm opacity-70 mb-4">
|
<p class="text-sm opacity-70 mb-4">
|
||||||
{if admin?(assigns), do: "Change any fields below. Changes will be applied immediately.", else: "Change any fields below. Only fields you modify will be submitted for review."}
|
{if admin?(assigns),
|
||||||
|
do: "Change any fields below. Changes will be applied immediately.",
|
||||||
|
else: "Change any fields below. Only fields you modify will be submitted for review."}
|
||||||
</p>
|
</p>
|
||||||
<.form
|
<.form
|
||||||
for={@edit_form}
|
for={@edit_form}
|
||||||
|
|
@ -1503,7 +1507,7 @@ defmodule MicrowavepropWeb.ContactLive.Show do
|
||||||
samples: length(ep.points),
|
samples: length(ep.points),
|
||||||
dist: format_dist(ep.dist_km),
|
dist: format_dist(ep.dist_km),
|
||||||
source: "SRTM 1-arcsecond",
|
source: "SRTM 1-arcsecond",
|
||||||
duct_count: length(ep.ducts || [])
|
duct_count: length(ep.ducts)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -1768,7 +1772,7 @@ defmodule MicrowavepropWeb.ContactLive.Show do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp time_note(ts, lon) do
|
defp time_note(ts, lon) do
|
||||||
solar_hour = ts.hour + ts.minute / 60 + (lon || 0) / 15
|
solar_hour = ts.hour + ts.minute / 60 + lon / 15
|
||||||
solar_hour = rem_float(solar_hour + 24, 24)
|
solar_hour = rem_float(solar_hour + 24, 24)
|
||||||
h = round(solar_hour)
|
h = round(solar_hour)
|
||||||
|
|
||||||
|
|
@ -1817,7 +1821,6 @@ defmodule MicrowavepropWeb.ContactLive.Show do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp sky_note(nil), do: "—"
|
defp sky_note(nil), do: "—"
|
||||||
defp sky_note(pct), do: "#{round(pct)}% cloud cover"
|
|
||||||
|
|
||||||
defp season_note(month, band_config) do
|
defp season_note(month, band_config) do
|
||||||
month_names = ~w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
|
month_names = ~w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
|
||||||
|
|
@ -1828,20 +1831,6 @@ defmodule MicrowavepropWeb.ContactLive.Show do
|
||||||
|
|
||||||
defp wind_note(nil), do: "—"
|
defp wind_note(nil), do: "—"
|
||||||
|
|
||||||
defp wind_note(kts) do
|
|
||||||
k = Float.round(kts, 1)
|
|
||||||
|
|
||||||
label =
|
|
||||||
cond do
|
|
||||||
k < 5 -> "calm"
|
|
||||||
k < 15 -> "light"
|
|
||||||
k < 25 -> "moderate"
|
|
||||||
true -> "strong"
|
|
||||||
end
|
|
||||||
|
|
||||||
"#{k} kts (#{label})"
|
|
||||||
end
|
|
||||||
|
|
||||||
defp rain_note(rate) when rate > 0, do: "#{Float.round(rate, 1)} mm/hr"
|
defp rain_note(rate) when rate > 0, do: "#{Float.round(rate, 1)} mm/hr"
|
||||||
defp rain_note(_), do: "None"
|
defp rain_note(_), do: "None"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,16 +40,12 @@ defmodule Mix.Tasks.HrrrNativeDeriveFields do
|
||||||
Enum.count(profiles, fn profile ->
|
Enum.count(profiles, fn profile ->
|
||||||
derived = derive(profile)
|
derived = derive(profile)
|
||||||
|
|
||||||
if derived do
|
{1, _} =
|
||||||
{1, _} =
|
HrrrNativeProfile
|
||||||
HrrrNativeProfile
|
|> where([p], p.id == ^profile.id)
|
||||||
|> where([p], p.id == ^profile.id)
|
|> Repo.update_all(set: derived)
|
||||||
|> Repo.update_all(set: derived)
|
|
||||||
|
|
||||||
true
|
true
|
||||||
else
|
|
||||||
false
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Mix.shell().info("Updated #{count} profiles with derived turbulence fields.")
|
Mix.shell().info("Updated #{count} profiles with derived turbulence fields.")
|
||||||
|
|
|
||||||
|
|
@ -63,18 +63,16 @@ defmodule Mix.Tasks.ScorerDiff do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp validate_weight_keys!(weights) do
|
defp validate_weight_keys!(weights) do
|
||||||
expected_keys =
|
expected_keys = ~w(humidity time_of_day td_depression refractivity sky season wind rain pressure pwat)
|
||||||
MapSet.new(~w(humidity time_of_day td_depression refractivity sky season wind rain pressure pwat))
|
provided_keys = Map.keys(weights)
|
||||||
|
|
||||||
provided_keys = MapSet.new(Map.keys(weights))
|
missing = expected_keys -- provided_keys
|
||||||
|
extra = provided_keys -- expected_keys
|
||||||
missing = MapSet.difference(expected_keys, provided_keys)
|
|
||||||
extra = MapSet.difference(provided_keys, expected_keys)
|
|
||||||
|
|
||||||
errors =
|
errors =
|
||||||
[]
|
[]
|
||||||
|> prepend_if(MapSet.size(missing) > 0, "Missing: #{inspect(MapSet.to_list(missing))}")
|
|> prepend_if(missing != [], "Missing: #{inspect(missing)}")
|
||||||
|> prepend_if(MapSet.size(extra) > 0, "Extra: #{inspect(MapSet.to_list(extra))}")
|
|> prepend_if(extra != [], "Extra: #{inspect(extra)}")
|
||||||
|
|
||||||
if errors != [] do
|
if errors != [] do
|
||||||
Mix.raise("Invalid weight keys. " <> Enum.join(errors, " "))
|
Mix.raise("Invalid weight keys. " <> Enum.join(errors, " "))
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue