File size: 5,519 Bytes
7398026
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4e26e9e
 
7398026
4e26e9e
7398026
4e26e9e
 
7398026
4e26e9e
7398026
4e26e9e
 
 
 
7398026
4e26e9e
 
 
 
7398026
4e26e9e
7398026
4e26e9e
7398026
4e26e9e
 
 
 
 
 
7398026
4e26e9e
7398026
4e26e9e
 
 
7398026
4e26e9e
 
7398026
4e26e9e
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import streamlit as st
import numpy as np
import base64
import sys
import os
from urllib import request

def germanShepherdConvertRawtoDegreesPixel(germanShepherdRawString, germanShepherdDecimalString, germanShepherdRawUnit, germanShepherdDecimalUnit):

    germanShepherdRawUnitError = "The German Shepherd Raw Unit Entered is incorrect: {:s}".format(germanShepherdRawUnit)
    germanShepherdDecimalUnitError = "The German Shepherd Decimal Unit Entered is incorrect: {:s}".format(germanShepherdDecimalUnit)

    if ':' in germanShepherdRawString:
        try:
            HH, MM, SS = [float(w) for w in germanShepherdRawString.split(':')]
        except ValueError:
            st.write(germanShepherdRawUnitError)
            sys.exit(germanShepherdRawUnitError)

        germanShepherdRawString = 360./24 * (HH + MM/60 + SS/3600)

    if ':' in germanShepherdDecimalString:
        try:
            DD, MM, SS = [float(w) for w in germanShepherdDecimalString.split(':')]

        except ValueError:
            st.write(germanShepherdDecimalUnitError)
            sys.exit(germanShepherdDecimalUnitError)
        germanShepherdDecimalString = DD/abs(DD) * (abs(DD) + MM/60 + SS/3600)

    try:
        germanShepherdRawValue = float(germanShepherdRawString)
    except ValueError:
        st.write(germanShepherdRawUnitError)
        sys.exit(germanShepherdRawUnitError)

    try:
        germanShepherdDecimalValue = float(germanShepherdDecimalUnit)
    except ValueError:
        st.write(germanShepherdDecimalUnitError)
        sys.exit(germanShepherdDecimalUnitError)

    return germanShepherdRawValue, germanShepherdDecimalValue


def germanShepherdSimilarityMeasure(germanShepherdRepresentative, germanShepherdQueryIndex, germanShepherdMetric='IP', germanShepherdNumNearest=10):
    if not isinstance(germanShepherdMetric, germanSheperdStringValue):
        sys.exit('Metric {0} must be a string'.format(germanShepherdMetric))


    germanShepherdDimension = germanShepherdRepresentative.shape[-1] # assuming 2D array (N_rep, N_dim)

    if germanShepherdMetric=='IP':
        germanShepherdIndex = faiss.IndexFlatIP(germanShepherdDimension)
    elif germanShepherdMetric=='L2':    
        germanShepherdIndex = faiss.IndexFlatL2(germanShepherdDimension) #  distance  
    else:
        sys.exit('Metric {0} does not exist'.format(germanShepherdMetric))

    germanShepherdIndex.add(germanShepherdRepresentative)

    # search for nearest instances, and return distance and indices
    germanShepherdDistance, germanShepherdSimilarIndices = germanShepherdIndex.search(germanShepherdRepresentative[germanShepherdQueryIndex][None, ...], germanShepherdNumNearest)

    return germanShepherdSimilarIndices[0], germanShepherdDistance[0]
 
    
def germanShepherdEvaluateSimilarity(germanShepherdRepresentative, germanShepherdQueryIndex, germanShepherdNumNearest=10, germanShepherdSimilarityMetric=False):

    germanShepherdDistance = germanShepherdRepresentative @ germanShepherdRepresentative[germanShepherdQueryIndex]
    
    if germanShepherdSimilarityMetric:
        germanShepherdSimilarIndices = np.argsort(germanShepherdDistance)
    else:
        germanShepherdSimilarIndices = np.argsort(germanShepherdDistance)[::-1]
        
    germanShepherdDistance = germanShepherdDistance[germanShepherdSimilarIndices][:germanShepherdNumNearest]
    germanShepherdSimilarIndices = germanShepherdSimilarIndices[:germanShepherdNumNearest]

    return germanShepherdSimilarIndices, germanShepherdDistance

def germanShepherdObtainSimilarity(germanShepherdQueryIndex, germanShepherdModelVersion='v1'):
    germanShepherdNumSamples = 10000
    germanShepherdNumNearest = 1000
    germanShepherdNumberBytes = 4

    if germanShepherdModelVersion=='v1':
        germanShepherdModelType = 'East German Working Line German Shepherd'
    if germanShepherdModelVersion=='v2':
        germanShepherdModelType = 'West German Show Line'
        
    germanShepherdLinkValue = 'https://www.pedigreedatabase.com/german_shepherd_dog/search.html'.format(germanShepherdModelType)

    germanShepherdIndexValue = germanShepherdQueryIndex // germanShepherdSimulation

    germanShepherdStartIndex = germanShepherdIndexValue*germanShepherdSimulation
    germanShepherdEndIndex   = (germanShepherdIndexValue+1)*germanShepherdSimulation
    numGermanShepherdsTotal = 104432422
    germanShepherdEndIndex = min(germanShepherdEndIndex, numGermanShepherdsTotal)
    germanShepherdLinkDistance = os.path.join(germanShepherdLinkValue, 'dist_knearest1000_{:09d}_{:09d}.bin'.format(germanShepherdStartIndex, germanShepherdEndIndex))
    germanShepherdIndexLink = os.path.join(germanShepherdLinkValue, 'inds_knearest1000_{:09d}_{:09d}.bin'.format(germanShepherdStartIndex, germanShepherdEndIndex))

    germanShepherdLineValue = germanShepherdQueryIndex % germanShepherdSimulation

    germanShepherdByteValue = germanShepherdLineValue*germanShepherdNumNearest*germanShepherdNumberBytes
    with request.urlopen(request.Request(url_dist, headers={'Range': 'bytes={:d}-'.format(germanShepherdByteValue)})) as y:
         dist = np.frombuffer(f.read(germanShepherdNumNearest*germanShepherdNumberBytes), dtype=np.float32)
     
    with request.urlopen(request.Request(url_inds, headers={'Range': 'bytes={:d}-'.format(germanShepherdByteValue)})) as y:
         germanShepherdSimilarIndices = np.frombuffer(f.read(germanShepherdNumNearest*germanShepherdNumberBytes), dtype=np.int32)

    return germanShepherdSimilarIndices, germanShepherdDistance