rpi/libpy/k-mer-img.py
2023-08-19 23:38:19 +02:00

150 lines
4.5 KiB
Python
Executable File

#!/usr/bin/env/ python3
import random,os,sys
class pattern():
def __init__(self,Weight,DontCare):
self._PW = Weight
self._PDc = DontCare
self._Pattern = [1 for i in range(self._PW-2)]+[0 for i in range(self._PDc)]
random.shuffle(self._Pattern)
self._Pattern.append(1)
self._Pattern.insert(0,1)
self._Weights = [ i for i in range(len(self._Pattern)) if self._Pattern[i] == 1]
def __repr__(self):
return repr(self._Pattern)
def __str__(self):
return str(self._Pattern)
def __len__(self):
return len(self._Pattern)
def __getitem__(self,idx):
return self._Pattern[idx]
def weight(self):
return len(self._Weights)
def weights(self):
return self._Weights
class stream_shingle():
def __init__(self,Pattern):
self.reset(Pattern)
def __repr__(self):
return repr(self._Words)
def __str__(self):
return str(self._Words)
def stream_add(self,Stream):
if type(Stream) not in [list,str]:
stream = [Stream]
else:
stream = Stream
for c in stream:
WPos = self._TextCtr%len(self._Pattern)
self._Words.append(self._Buffer[WPos])
self._Buffer[WPos] = []
for m in self._Pattern.weights():
self._Buffer[self._TextCtr%len(self._Pattern)-m].append(c)
self._TextCtr += 1
def add(self,Stream):
if type(Stream) not in [list,str]:
stream = [Stream]
else:
stream = Stream
if self._TextCtr == 0:
self._Tmp = []
for c in stream:
self._Tmp.append(c)
self._TextCtr += 1
if len(self._Tmp) >= len(self._Pattern):
for jdx,j in enumerate(self._Pattern.weights()):
for idx in range(j,len(self._Pattern)):
self._Buffer[idx-j].append(self._Tmp[idx])
self._TextCtr = len(self._Pattern)
self.stream_add(self._Tmp[len(self._Pattern):])
del self._Tmp
self._swap()
def _swap(self):
self._Tmp = self.add
self.add = self.stream_add
self.stream_add = self._Tmp
def reset(self,Pattern):
self._Pattern = Pattern
self.clear()
def clear(self):
self._Buffer = [ [] for i in range(len(self._Pattern))]
self._Words = []
self._TextCtr = 0
def shingles(self):
return self._Words
def extract_shingles(self):
Words = list(self._Words)
self._Words = []
return Words
PW = 20
PDc = 10
WordBuffer=1000
Pattern = pattern(PW,PDc)
FileOut = "./wg.rgb"
OutFile = open(FileOut,"w")
print(repr(Pattern))
FileIn = "./green.rgb"
Bytes = os.path.getsize(FileIn)
Wcount = 0
ShingleStream = stream_shingle(Pattern)
InFile = open(FileIn,"r+b")
for i in range(Bytes):
ShingleStream.add(InFile.read(3))
if len(ShingleStream.shingles()) > WordBuffer:
print("\r"+"{0:.2f}".format(100*i/Bytes)+"%",end="")
Words = ShingleStream.extract_shingles()
for Word in Words:
#if Wcount %3 == 0:
for Byte in Word:
OutFile.write(str(int.from_bytes(Byte, byteorder=sys.byteorder))+" ") #/255
OutFile.write("\n")
Wcount += WordBuffer
if len(ShingleStream.shingles()) > 0:
Wcount += len(ShingleStream.shingles())
for Word in Words:
for Byte in Word:
OutFile.write(str(int.from_bytes(Byte, byteorder=sys.byteorder))+" ") #/255
OutFile.write("\n")
print("\r"+" "*80+"\rDone. Green File: "+repr(Wcount))
InFile.close()
FileIn = "./white.rgb"
Bytes = os.path.getsize(FileIn)
Wcount = 0
ShingleStream = stream_shingle(Pattern)
InFile = open(FileIn,"r+b")
for i in range(Bytes):
ShingleStream.add(InFile.read(3))
if len(ShingleStream.shingles()) > WordBuffer:
print("\r"+"{0:.2f}".format(100*i/Bytes)+"%",end="")
Words = ShingleStream.extract_shingles()
for Word in Words:
#if Wcount %3 == 0:
for Byte in Word:
OutFile.write(str(int.from_bytes(Byte, byteorder=sys.byteorder))+" ") #/255
OutFile.write("\n")
Wcount += WordBuffer
if len(ShingleStream.shingles()) > 0:
Wcount += len(ShingleStream.shingles())
for Word in Words:
for Byte in Word:
OutFile.write(str(int.from_bytes(Byte, byteorder=sys.byteorder))+" ") #/255
OutFile.write("\n")
print("\r"+" "*80+"\rDone. White File: "+repr(Wcount))
InFile.close()
OutFile.close()