You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

LLamaTokenDataArray.cs 3.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using System.Buffers;
  3. using System.Runtime.InteropServices;
  4. using llama_token = System.Int32;
  5. namespace LLama.Native
  6. {
  7. /// <summary>
  8. /// Contains an array of LLamaTokenData, potentially sorted.
  9. /// </summary>
  10. public struct LLamaTokenDataArray
  11. {
  12. /// <summary>
  13. /// The LLamaTokenData
  14. /// </summary>
  15. public readonly Memory<LLamaTokenData> data;
  16. /// <summary>
  17. /// Indicates if `data` is sorted by logits in descending order. If this is false the token data is in _no particular order_.
  18. /// </summary>
  19. public bool sorted;
  20. /// <summary>
  21. /// Create a new LLamaTokenDataArray
  22. /// </summary>
  23. /// <param name="tokens"></param>
  24. /// <param name="isSorted"></param>
  25. public LLamaTokenDataArray(Memory<LLamaTokenData> tokens, bool isSorted = false)
  26. {
  27. data = tokens;
  28. sorted = isSorted;
  29. }
  30. /// <summary>
  31. /// Create a new LLamaTokenDataArray, copying the data from the given logits
  32. /// </summary>
  33. /// <param name="logits"></param>
  34. /// <returns></returns>
  35. public static LLamaTokenDataArray Create(ReadOnlySpan<float> logits)
  36. {
  37. var candidates = new LLamaTokenData[logits.Length];
  38. for (var token_id = 0; token_id < logits.Length; token_id++)
  39. candidates[token_id] = new LLamaTokenData(token_id, logits[token_id], 0.0f);
  40. return new LLamaTokenDataArray(candidates);
  41. }
  42. }
  43. /// <summary>
  44. /// Contains a pointer to an array of LLamaTokenData which is pinned in memory.
  45. /// </summary>
  46. [StructLayout(LayoutKind.Sequential)]
  47. public struct LLamaTokenDataArrayNative
  48. {
  49. /// <summary>
  50. /// A pointer to an array of LlamaTokenData
  51. /// </summary>
  52. /// <remarks>Memory must be pinned in place for all the time this LLamaTokenDataArrayNative is in use</remarks>
  53. public IntPtr data;
  54. /// <summary>
  55. /// Number of LLamaTokenData in the array
  56. /// </summary>
  57. public ulong size;
  58. /// <summary>
  59. /// Indicates if the items in the array are sorted
  60. /// </summary>
  61. public bool sorted
  62. {
  63. get => Convert.ToBoolean(_sorted);
  64. set => _sorted = Convert.ToSByte(value);
  65. }
  66. private sbyte _sorted;
  67. /// <summary>
  68. /// Create a new LLamaTokenDataArrayNative around the data in the LLamaTokenDataArray
  69. /// </summary>
  70. /// <param name="array">Data source</param>
  71. /// <param name="native">Created native array</param>
  72. /// <returns>A memory handle, pinning the data in place until disposed</returns>
  73. public static MemoryHandle Create(LLamaTokenDataArray array, out LLamaTokenDataArrayNative native)
  74. {
  75. var handle = array.data.Pin();
  76. unsafe
  77. {
  78. native = new LLamaTokenDataArrayNative
  79. {
  80. data = new IntPtr(handle.Pointer),
  81. size = (ulong)array.data.Length,
  82. sorted = array.sorted
  83. };
  84. }
  85. return handle;
  86. }
  87. }
  88. }