forked from mazzzystar/Queryable
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPhotoSearchModel.swift
More file actions
45 lines (37 loc) · 1.54 KB
/
PhotoSearchModel.swift
File metadata and controls
45 lines (37 loc) · 1.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//
// PhotoSearcherModel.swift
// TestEncoder
//
// Created by Ke Fang on 2022/12/08.
//
import UIKit
import CoreML
import Foundation
import Accelerate
struct PhotoSearcherModel {
private var texEncoder: TextEncoder?
mutating func load_text_encoder() {
guard let path = Bundle.main.path(forResource: "CoreMLModels", ofType: nil, inDirectory: nil) else {
fatalError("Fatal error: failed to find the CoreML models.")
}
let resourceURL = URL(fileURLWithPath: path)
// TODO: move the pipeline creation to background task because it's heavy
let encoder = try! TextEncoder(resourcesAt: resourceURL)
texEncoder = encoder
}
func text_embedding(prompt: String) -> MLShapedArray<Float32> {
let emb = try! texEncoder?.computeTextEmbedding(prompt: prompt)
return emb!
}
func cosine_similarity(A: MLShapedArray<Float32>, B: MLShapedArray<Float32>) async -> Float {
let magnitude = vDSP.sumOfSquares(A.scalars).squareRoot() * vDSP.sumOfSquares(B.scalars).squareRoot()
let dotarray = vDSP.dot(A.scalars, B.scalars)
return dotarray / magnitude
}
func spherical_dist_loss(A: MLShapedArray<Float32>, B: MLShapedArray<Float32>) async -> Float {
let a = vDSP.divide(A.scalars, sqrt(vDSP.sumOfSquares(A.scalars)))
let b = vDSP.divide(B.scalars, sqrt(vDSP.sumOfSquares(B.scalars)))
let magnitude = sqrt(vDSP.sumOfSquares(vDSP.subtract(a, b)))
return pow(asin(magnitude / 2.0), 2) * 2.0
}
}