Merger Node Complete

This commit is contained in:
Florent Guiotte 2018-08-27 11:04:20 +02:00
parent be3c43849d
commit b0ea86e6cb
5 changed files with 108 additions and 36 deletions

View File

@ -8,7 +8,7 @@
#
# TODO details
from ld2dap.core import Filter, Stack
from ld2dap.core import Filter, Stack, Stacker
import numpy as np
class LocalFeatures(Filter):
@ -57,38 +57,3 @@ def create_patches(array, patch_size=3):
stack.append(offset)
return np.stack(stack, axis=-1)
class Stacker:
def __init__(self):
self.offset = 0
self.data_list = list()
self.metadata_list = list()
def auto_stack(self, data, old_stack, desc_str, symb_str):
if data.shape[-1] != (old_stack.end - old_stack.begin):
raise ValueError("Mismatch between data shape and stack length")
new_desc = list()
for d in old_stack.desc:
new_desc.append(d.copy())
new_desc[-1].append(desc_str)
new_symb = list()
for s in old_stack.symb:
new_symb.append([symb_str + '('])
new_symb[-1].extend(s.copy())
new_symb[-1].append(')')
self.stack(data, new_desc, new_symb)
def stack(self, data, desc, symb):
size_new = data.shape[-1]
stack_new = Stack(self.offset, size_new)
self.offset += size_new
stack_new.desc = desc
stack_new.symb = symb
self.data_list.append(data)
self.metadata_list.append(stack_new)
def pack(self):
return np.dstack(self.data_list), self.metadata_list

57
ld2dap/Merger.py Normal file
View File

@ -0,0 +1,57 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# \file Merger.py
# \brief TODO
# \author Florent Guiotte <florent.guiotte@gmail.com>
# \version 0.1
# \date 24 août 2018
#
# TODO details
from ld2dap.core import Filter, Output, Stacker
import numpy as np
class Merger(Filter):
def __init__(self):
super().__init__(self.__class__.__name__)
"""Merger Node, merge two stream inputs"""
self.data = None
self.metadata = None
self.second = self.SecondInput(self)
def process(self, data=None, metadata=None):
"""Override the Input override"""
if data is not None:
self.logger.info('Register first input')
self.data = data
self.metadata = metadata
else:
self.logger.info('Register second input')
if self.second.data is None or self.data is None:
return
self.logger.info('Merging inputs')
offset = self.data.shape[-1]
data = np.dstack((self.data, self.second.data))
metadata = self.metadata
for stack in self.second.metadata:
stack.begin += offset
stack.end += offset
metadata.append(stack)
for output in self.outputs:
output.process(data, [x.copy() for x in metadata])
class SecondInput(Output):
def __init__(self, merger):
super().__init__(self.__class__.__name__)
self.merger = merger
self.data = None
self.metadata = None
def _process(self, data, metadata):
self.data = data
self.metadata = metadata
self.merger.process()

View File

@ -10,6 +10,7 @@
from .AttributeProfiles import AttributeProfiles
from .SelfDualAttributeProfiles import SelfDualAttributeProfiles
from .Merger import Merger
from .LocalFeatures import LocalFeatures
from .Treshold import Treshold
from .LoadTIFF import LoadTIFF

48
ld2dap/core/Stacker.py Normal file
View File

@ -0,0 +1,48 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# \file %filename%.py
# \brief TODO
# \author Florent Guiotte <florent.guiotte@gmail.com>
# \version 0.1
# \date 27 août 2018
#
# TODO details
import numpy as np
from .Stack import Stack
class Stacker:
def __init__(self):
self.offset = 0
self.data_list = list()
self.metadata_list = list()
def auto_stack(self, data, old_stack, desc_str, symb_str):
if data.shape[-1] != (old_stack.end - old_stack.begin):
raise ValueError("Mismatch between data shape and stack length")
new_desc = list()
for d in old_stack.desc:
new_desc.append(d.copy())
new_desc[-1].append(desc_str)
new_symb = list()
for s in old_stack.symb:
new_symb.append([symb_str + '('])
new_symb[-1].extend(s.copy())
new_symb[-1].append(')')
self.stack(data, new_desc, new_symb)
def stack(self, data, desc, symb):
size_new = data.shape[-1]
stack_new = Stack(self.offset, size_new)
self.offset += size_new
stack_new.desc = desc
stack_new.symb = symb
self.data_list.append(data)
self.metadata_list.append(stack_new)
def pack(self):
return np.dstack(self.data_list), self.metadata_list

View File

@ -12,3 +12,4 @@ from .Output import Output
from .Input import Input
from .Filter import Filter
from .Stack import Stack
from .Stacker import Stacker