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