defmodule MedicalTranscription.Vectorizer do use GenServer @doc "Check if the precalculated vector embeddings exist on disk already." def vectors_present? do AudioTagger.SampleData.cache_dir() |> Path.join("icd9_codelist.bin") |> File.exists?() end # Client API def start_link(_) do GenServer.start_link(__MODULE__, :pending, name: MedicalTranscription.Vectorizer) end # Server callbacks @impl GenServer def init(state) do IO.inspect(state, label: "Vectorizer GenServer started with state") {:ok, state} end @impl GenServer def handle_call(:get_status, _from, state) do # Return an atom containing the current status {:reply, state, state} end @impl GenServer def handle_cast(:generate, state) do if state == :pending do send(self(), :generate) {:noreply, :in_process} else # Do nothing {:noreply, state} end end @impl GenServer def handle_info(:generate, _state) do # Build the embeddings IO.puts("Building vectors embeddings for ICD-9 codelist") unless File.exists?(cached_download()) do AudioTagger.SampleData.get_icd9_code_list_csv() end AudioTagger.Vectors.precalculate(cached_download()) {:noreply, :complete} end defp cached_download() do AudioTagger.SampleData.cache_dir() |> Path.join("icd9_codelist.csv") end end