The Computer Language
24.04 Benchmarks Game

k-nucleotide F# .NET #6 program

source code

// The Computer Language Benchmarks Game
// https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
//
// ported from C# version by Anthony Lloyd
// Use DictionarySlim by Anthony Lloyd

open System
open Microsoft.Collections.Extensions

[<Literal>]
let BLOCK_SIZE = 8388608 // 1024 * 1024 * 8

[<EntryPoint>]
let main _ =
  let threeStart,threeBlocks,threeEnd =
    let input = Console.OpenStandardInput()
    let mutable threeEnd = 0
    let read buffer =
        let rec read offset count =
            let bytesRead = input.Read(buffer, offset, count)
            if bytesRead=count then offset+count
            elif bytesRead=0 then offset
            else read (offset+bytesRead) (count-bytesRead)
        threeEnd <- read 0 BLOCK_SIZE

    let rec findHeader matchIndex buffer =
        let toFind = ">THREE"B
        let find i matchIndex =
            let rec find i matchIndex =
                if matchIndex=0 then
                    let i = Array.IndexOf(buffer, toFind.[0], i)
                    if -1=i then -1,0
                    else find (i+1) 1
                else
                    let fl = toFind.Length
                    let rec tryMatch i matchIndex =
                        if i>=BLOCK_SIZE || matchIndex>=fl then i,matchIndex
                        else
                            if buffer.[i]=toFind.[matchIndex] then
                                tryMatch (i+1) (matchIndex+1)
                            else
                                find i 0
                    let i,matchIndex = tryMatch i matchIndex
                    if matchIndex=fl then i,matchIndex else -1,matchIndex
            find i matchIndex
        read buffer
        let i,matchIndex = find 0 matchIndex
        if -1<>i then i,buffer
        else findHeader matchIndex buffer

    let rec findSequence i buffer =
        let i = Array.IndexOf(buffer, '\n'B, i)
        if i <> -1 then buffer,i+1
        else
            read buffer
            findSequence 0 buffer

    let buffer,threeStart = Array.zeroCreate BLOCK_SIZE
                            |> findHeader 0 ||> findSequence

    let threeBlocks =
        if threeEnd<>BLOCK_SIZE then // Needs to be at least 2 blocks
            for i = threeEnd to BLOCK_SIZE-1 do
                buffer.[i] <- 255uy
            threeEnd <- 0
            [[||];buffer]
        else
            let rec findEnd i buffer threeBlocks =
                let i = Array.IndexOf(buffer, '>'B, i)
                if i <> -1 then
                    threeEnd <- i
                    buffer::threeBlocks
                else
                    let threeBlocks = buffer::threeBlocks
                    let buffer = Array.zeroCreate BLOCK_SIZE
                    read buffer
                    if threeEnd<>BLOCK_SIZE then buffer::threeBlocks
                    else findEnd 0 buffer threeBlocks
            let threeBlocks = findEnd threeStart buffer []
            if threeStart+18>BLOCK_SIZE then // Key needs to be in first block
                let block0 = threeBlocks.[0]
                let block1 = threeBlocks.[1]
                Buffer.BlockCopy(block0, threeStart, block0, threeStart-18,
                    BLOCK_SIZE-threeStart)
                Buffer.BlockCopy(block1, 0, block0, BLOCK_SIZE-18, 18)
                for i = 0 to 17 do block1.[i] <- 255uy
            threeBlocks

    threeStart, List.rev threeBlocks |> List.toArray, threeEnd

  let toChar = [|'A'; 'C'; 'G'; 'T'|]
  let toNum = Array.zeroCreate 256
  toNum.[int 'c'B] <- 1uy; toNum.[int 'C'B] <- 1uy
  toNum.[int 'g'B] <- 2uy; toNum.[int 'G'B] <- 2uy
  toNum.[int 't'B] <- 3uy; toNum.[int 'T'B] <- 3uy
  toNum.[int '\n'B] <- 255uy; toNum.[int '>'B] <- 255uy; toNum.[255] <- 255uy

  Array.Parallel.iter (fun bs ->
    for i = 0 to Array.length bs-1 do
        bs.[i] <- toNum.[int bs.[i]]
  ) threeBlocks

  let count l mask (summary:_->string) = async {
      let mutable rollingKey = 0
      let firstBlock = threeBlocks.[0]
      let rec startKey l start =
          if l>0 then
             rollingKey <- rollingKey <<< 2 ||| int firstBlock.[start]
             startKey (l-1) (start+1)
      startKey l threeStart
      let dict = DictionarySlim<int,int> 256
      let inline check a lo hi =
        for i = lo to hi do
          let nb = Array.get a i
          if nb<>255uy then
              rollingKey <- rollingKey &&& mask <<< 2 ||| int nb
              let x = &dict.GetOrAddValueRef(rollingKey)
              x <- x + 1

      check firstBlock (threeStart+l) (BLOCK_SIZE-1)
      
      for i = 1 to threeBlocks.Length-2 do
          check threeBlocks.[i] 0 (BLOCK_SIZE-1)
          
      let lastBlock = threeBlocks.[threeBlocks.Length-1]
      check lastBlock 0 (threeEnd-1)
      return summary dict
    }

  let writeFrequencies fragmentLength (freq:DictionarySlim<int,int>) =
    let percent = 100.0 / (freq |> Seq.sumBy (fun i -> i.Value) |> float)
    freq |> Seq.sortByDescending (fun kv -> kv.Value)
    |> Seq.collect (fun kv ->
        let keyChars = Array.zeroCreate fragmentLength
        let mutable key = kv.Key
        for i in keyChars.Length-1..-1..0 do
            keyChars.[i] <- toChar.[int key &&& 0x3]
            key <- key >>> 2
        [String(keyChars);" ";(float kv.Value * percent).ToString("F3");"\n"]
      )
    |> String.Concat

  let writeCount (fragment:string) (dict:DictionarySlim<int,int>) =
    let mutable key = 0
    for i = 0 to fragment.Length-1 do
        key <- key <<< 2 ||| int toNum.[int fragment.[i]]
    let _,v = dict.TryGetValue key
    String.Concat(string v, "\t", fragment)

  let countEnding l mask b =
    let mutable rollingKey = 0L
    let firstBlock = threeBlocks.[0]
    let rec startKey l start =
          if l>0 then
             rollingKey <- rollingKey <<< 2 ||| int64 firstBlock.[start]
             startKey (l-1) (start+1)
    startKey l threeStart
    let dict = DictionarySlim<int64,int> 256
    let inline check a lo hi =
        for i = lo to hi do
          let nb = Array.get a i
          if nb=b then
            rollingKey <- rollingKey &&& mask <<< 2 ||| int64 nb
            let x = &dict.GetOrAddValueRef(rollingKey)
            x <- x + 1
          elif nb<>255uy then
            rollingKey <- rollingKey &&& mask <<< 2 ||| int64 nb

    check firstBlock (threeStart+l) (BLOCK_SIZE-1)

    for i = 1 to threeBlocks.Length-2 do
        check threeBlocks.[i] 0 (BLOCK_SIZE-1)

    let lastBlock = threeBlocks.[threeBlocks.Length-1]
    check lastBlock 0 (threeEnd-1)

    dict

  let count64 l mask (summary:_->string) = async {
      let! dicts =
        Seq.init 4 (fun i -> async { return byte i |> countEnding l mask })
        |> Async.Parallel
      let d = DictionarySlim<int64,int>(dicts |> Array.sumBy (fun i -> i.Count))
      dicts |> Array.iter (fun di ->
        di |> Seq.iter (fun kv ->
          let x = &d.GetOrAddValueRef kv.Key
          x <- kv.Value
        )
      )
      return summary d
    }

  let writeCount64 (fragment:string) (dict:DictionarySlim<_,_>) =
    let mutable key = 0L
    for i = 0 to fragment.Length-1 do
        key <- key <<< 2 ||| int64 toNum.[int fragment.[i]]
    let _,v = dict.TryGetValue key
    String.Concat(string v, "\t", fragment)

  Async.Parallel [
    count64 18 0x7FFFFFFFFL (writeCount64 "GGTATTTTAATTTATAGT")
    count 12 0x7FFFFF (writeCount "GGTATTTTAATT")
    count 6 0x3FF (writeCount "GGTATT")
    count 4 0x3F (writeCount "GGTA")
    count 3 0xF (writeCount "GGT")
    count 2 0x3 (writeFrequencies 2)
    count 1 0 (writeFrequencies 1)
  ]
  |> Async.RunSynchronously
  |> Array.rev
  |> Array.iter stdout.WriteLine

  exit 0
    

notes, command-line, and program output

NOTES:
64-bit Ubuntu quad core
.NET SDK 8.0.200
Host Version: 8.0.2
Commit: 1381d5ebd2
<ServerGarbageCollection>true
F# 8.0



 Wed, 06 Mar 2024 21:15:27 GMT

MAKE:
cp knucleotide.fsharpcore-6.fsharpcore Program.fs
cp Include/fsharpcore/tmp.fsproj .
mkdir obj
cp Include/fsharpcore/project.assets.json ./obj
/usr/bin/dotnet build -c Release --no-restore --no-self-contained -r linux-x64 
MSBuild version 17.9.4+90725d08d for .NET
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(8,16): error FS0039: The namespace 'Collections' is not defined. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(111,18): error FS0039: The value or constructor 'DictionarySlim' is not defined. Maybe you want one of the following:   dict [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(117,24): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(117,23): error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(118,15): error FS3224: The byref pointer is readonly, so this write is not permitted. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(130,45): error FS0039: The type 'DictionarySlim' is not defined. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(131,56): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(132,45): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(135,27): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(139,38): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(143,42): error FS0039: The type 'DictionarySlim' is not defined. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(147,15): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(158,16): error FS0039: The value or constructor 'DictionarySlim' is not defined. Maybe you want one of the following:   dict [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(164,22): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(164,21): error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(165,13): error FS3224: The byref pointer is readonly, so this write is not permitted. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(183,15): error FS0039: The value or constructor 'DictionarySlim' is not defined. Maybe you want one of the following:   dict   dicts [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(186,20): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(186,19): error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(187,16): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(187,11): error FS3224: The byref pointer is readonly, so this write is not permitted. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(193,44): error FS0039: The type 'DictionarySlim' is not defined. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(197,15): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]

Build FAILED.

/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(8,16): error FS0039: The namespace 'Collections' is not defined. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(111,18): error FS0039: The value or constructor 'DictionarySlim' is not defined. Maybe you want one of the following:   dict [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(117,24): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(117,23): error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(118,15): error FS3224: The byref pointer is readonly, so this write is not permitted. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(130,45): error FS0039: The type 'DictionarySlim' is not defined. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(131,56): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(132,45): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(135,27): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(139,38): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(143,42): error FS0039: The type 'DictionarySlim' is not defined. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(147,15): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(158,16): error FS0039: The value or constructor 'DictionarySlim' is not defined. Maybe you want one of the following:   dict [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(164,22): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(164,21): error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(165,13): error FS3224: The byref pointer is readonly, so this write is not permitted. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(183,15): error FS0039: The value or constructor 'DictionarySlim' is not defined. Maybe you want one of the following:   dict   dicts [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(186,20): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(186,19): error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(187,16): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(187,11): error FS3224: The byref pointer is readonly, so this write is not permitted. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(193,44): error FS0039: The type 'DictionarySlim' is not defined. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/Program.fs(197,15): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. [/home/dunham/all-benchmarksgame/benchmarksgame_i53330/knucleotide/tmp/tmp.fsproj]
    0 Warning(s)
    23 Error(s)

Time Elapsed 00:00:06.52
make: [/home/dunham/all-benchmarksgame/2000-benchmarksgame/nanobench/makefiles/u64q.programs.Makefile:148: knucleotide.fsharpcore-6.fsharpcore_run] Error 1 (ignored)

8.81s to complete and log all make actions

COMMAND LINE:
 ./bin/Release/net8.0/linux-x64/tmp 0 < knucleotide-input250000.txt

MAKE ERROR