Forge
csharp72c0d4fb
1using System.Security.Cryptography;
2using System.Text;
3
4namespace HybridCodebaseIndex.Core.Embeddings;
5
6/// <summary>
7/// Deterministic, dependency-free embedding for pipeline wiring.
8/// Not semantic; use a real provider for meaning.
9/// </summary>
10internal sealed class DummyEmbeddingProvider : IEmbeddingProvider
11{
12 public int Dimension { get; }
13
14 public DummyEmbeddingProvider(int dimension = 64)
15 {
16 Dimension = Math.Clamp(dimension, 16, 256);
17 }
18
19 public ValueTask<float[]> EmbedAsync(string text, CancellationToken cancellationToken)
20 {
21 cancellationToken.ThrowIfCancellationRequested();
22
23 // Hash -> expand into floats in [-1..1], then L2-normalize.
24 var bytes = Encoding.UTF8.GetBytes(text ?? "");
25 var hash = SHA256.HashData(bytes);
26
27 var v = new float[Dimension];
28 var j = 0;
29 while (j < Dimension)
30 {
31 // Mix hash with counter
32 var tmp = new byte[hash.Length + 4];
33 hash.CopyTo(tmp.AsSpan(0, hash.Length));
34 BitConverter.TryWriteBytes(tmp.AsSpan(hash.Length, 4), j);
35 var h2 = SHA256.HashData(tmp);
36
37 for (var i = 0; i < h2.Length && j < Dimension; i += 2, j++)
38 {
39 var u16 = (ushort)(h2[i] | (h2[Math.Min(i + 1, h2.Length - 1)] << 8));
40 v[j] = (u16 / 32767.5f) - 1f;
41 }
42 }
43
44 NormalizeInPlace(v);
45 return ValueTask.FromResult(v);
46 }
47
48 private static void NormalizeInPlace(float[] v)
49 {
50 double sum = 0;
51 foreach (var x in v)
52 sum += x * x;
53 var norm = Math.Sqrt(sum);
54 if (norm <= 1e-12)
55 return;
56 var inv = (float)(1.0 / norm);
57 for (var i = 0; i < v.Length; i++)
58 v[i] *= inv;
59 }
60}
61
62
View only · write via MCP/CIDE