Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • eclipse/aidge/aidge_core
  • hrouis/aidge_core
  • mszczep/aidge_core
  • oantoni/aidge_core
  • cguillon/aidge_core
  • jeromeh/aidge_core
  • axelfarr/aidge_core
  • cmoineau/aidge_core
  • noamzerah/aidge_core
  • lrakotoarivony/aidge_core
  • silvanosky/aidge_core
  • maab05/aidge_core
  • mick94/aidge_core
  • lucaslopez/aidge_core_ll
  • wboussella/aidge_core
  • farnez/aidge_core
  • mnewson/aidge_core
17 results
Show changes
Commits on Source (126)
Showing
with 231 additions and 232 deletions
......@@ -7,8 +7,10 @@ http://www.eclipse.org/legal/epl-2.0.
SPDX-License-Identifier: EPL-2.0
"""
from .aidge_core import * # import so generated by PyBind
from .export_utils import ExportNode, generate_file, generate_str
from .aidge_export_aidge import *
from . import utils
from aidge_core.aidge_core import * # import so generated by PyBind
import aidge_core.export_utils
import aidge_core.utils
from aidge_core.aidge_export_aidge import serialize_to_cpp
from aidge_core.show_graphview import gview_to_json
from aidge_core.mem_info import *
from ._version import *
......@@ -5,4 +5,4 @@ FILE = Path(__file__).resolve()
ROOT_EXPORT = FILE.parents[0]
from .operator_export import *
from .export import export
from .export import serialize_to_cpp
......@@ -2,15 +2,14 @@ import aidge_core
import shutil
import os
from pathlib import Path
from .utils import supported_operators, OPERATORS_REGISTRY
from . import ROOT_EXPORT
from aidge_core import ExportNode, generate_file
import aidge_core.export_utils
from . import ROOT_EXPORT
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.export_utils import generate_file
def export(export_folder: str,
def serialize_to_cpp(export_folder: str,
graph_view: aidge_core.GraphView,
enable_python_binding: bool = True,
):
......@@ -59,7 +58,6 @@ def export(export_folder: str,
open_nodes = list(graph_view.get_input_nodes())
# List of Aidge nodes already explored
closed_nodes = []
while open_nodes:
node = open_nodes.pop(0)
if node in closed_nodes:
......@@ -80,24 +78,34 @@ def export(export_folder: str,
continue
# Next nodes to treat are children of current node
open_nodes += list(node.get_children())
if node.type() in supported_operators():
list_operators.append(node.type())
op = OPERATORS_REGISTRY[node.type()](node)
# TODO: list_configs and list_actions don't need to be passed by argument
# Export the configuration
list_configs = op.export(export_folder_path, list_configs)
# Add forward kernel
list_actions = op.forward(list_actions)
else:
raise RuntimeError(f"Operator: {node.type()} is not supported")
node.get_operator().set_backend(ExportSerialize._name)
op_impl = node.get_operator().get_impl()
if op_impl is None:
raise RuntimeError(f"Operator {node.name()}[{node.type()}] doesn't have an implementation.")
if not isinstance(op_impl, ExportSerialize):
raise RuntimeError(f"Operator {node.name()}[{node.type()}] doesn't have an exportable backend ({op_impl}).")
required_specs = op_impl.get_required_spec()
specs = op_impl.get_best_match(required_specs)
export_node = op_impl.get_export_node(specs)
if export_node is None:
raise RuntimeError(f"Could not find export node for {node.name()}[{node.type()}].")
op = export_node(
node, None)
# set_operator.add(node.type())
# TODO: list_configs and list_actions don't need to be passed by argument
# Export the configuration
list_configs += op.export(export_folder_path)
# Add forward kernel
list_actions += op.forward()
closed_nodes.append(node)
list_operators = list(dict.fromkeys(list_operators)) # make unique
# Generate full dnn.cpp
aidge_core.generate_file(
aidge_core.export_utils.generate_file(
export_folder_path / "src/dnn.cpp",
ROOT_EXPORT / "templates/dnn.jinja",
headers=list_configs,
......
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@ExportSerialize.register("Add", ImplSpec(IOSpec(dtype.any)))
class Add(ExportNodeCpp):
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
self.config_template = ""
self.forward_template = str(
ROOT_EXPORT / "templates/graph_ctor/add.jinja")
self.include_list = ["aidge/operator/Add.hpp"]
self.kernels_to_copy = []
from aidge_core.aidge_export_aidge.utils import operator_register, parse_node_input
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core import ExportNode, generate_file, generate_str
from pathlib import Path
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register("Conv")
class Conv(ExportNode):
def __init__(self, node):
super().__init__(node)
def export(self, export_folder:Path, list_configs:list):
include_path = f"attributes/{self.name}.hpp"
filepath = export_folder / f"include/{include_path}"
generate_file(
filepath,
ROOT_EXPORT / "templates/attributes/conv.jinja",
name=self.name,
**self.attributes
)
list_configs.append(include_path)
return list_configs
def forward(self, list_actions:list):
list_actions.append(generate_str(
ROOT_EXPORT /"templates/graph_ctor/conv.jinja",
name=self.name,
inputs=parse_node_input(self.node.inputs()),
**self.attributes
))
return list_actions
@ExportSerialize.register(["Conv1D", "Conv2D"], ImplSpec(IOSpec(dtype.any)))
class Conv(ExportNodeCpp):
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
self.config_template = str(
ROOT_EXPORT / "templates/attributes/conv.jinja")
self.forward_template = str(
ROOT_EXPORT /"templates/graph_ctor/conv.jinja")
self.include_list = ["aidge/operator/Conv.hpp"]
self.kernels_to_copy = []
self.config_path = "include/attributes"
self.config_extension = "hpp"
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@ExportSerialize.register(["ConvDepthWise1D", "ConvDepthWise2D"], ImplSpec(IOSpec(dtype.any)))
class ConvDepthWise(ExportNodeCpp):
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
self.config_template = str(
ROOT_EXPORT / "templates/attributes/conv_depth_wise.jinja")
self.forward_template = str(
ROOT_EXPORT /"templates/graph_ctor/conv_depth_wise.jinja")
self.include_list = ["aidge/operator/ConvDepthWise.hpp"]
self.kernels_to_copy = []
self.config_path = "include/attributes"
self.config_extension = "hpp"
from aidge_core.aidge_export_aidge.utils import operator_register,parse_node_input
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core import ExportNode, generate_file, generate_str
from pathlib import Path
@operator_register("FC")
class FC(ExportNode):
def __init__(self, node):
super().__init__(node)
def export(self, export_folder:Path, list_configs:list):
include_path = f"attributes/{self.name}.hpp"
filepath = export_folder / f"include/{include_path}"
generate_file(
filepath,
ROOT_EXPORT / "templates/attributes/fc.jinja",
name=self.name,
InChannels=self.inputs_dims[1][1],
OutChannels=self.operator.out_channels(),
**self.attributes
)
list_configs.append(include_path)
return list_configs
def forward(self, list_actions:list):
list_actions.append(generate_str(
ROOT_EXPORT / "templates/graph_ctor/fc.jinja",
name=self.name,
inputs=parse_node_input(self.node.inputs()),
**self.attributes
))
return list_actions
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@ExportSerialize.register("FC", ImplSpec(IOSpec(dtype.any)))
class FC(ExportNodeCpp):
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
self.config_template = str(
ROOT_EXPORT / "templates/attributes/fc.jinja")
self.forward_template = str(
ROOT_EXPORT / "templates/graph_ctor/fc.jinja")
self.include_list = ["aidge/operator/FC.hpp"]
self.kernels_to_copy = []
self.config_path = "include/attributes"
self.config_extension = "hpp"
from aidge_core.aidge_export_aidge.utils import operator_register, parse_node_input
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core import ExportNode, generate_file, generate_str
from pathlib import Path
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register("MaxPooling")
class MaxPooling(ExportNode):
def __init__(self, node):
super().__init__(node)
def export(self, export_folder:Path, list_configs:list):
include_path = f"attributes/{self.name}.hpp"
filepath = export_folder / f"include/{include_path}"
generate_file(
filepath,
ROOT_EXPORT / "templates/attributes/maxpooling.jinja",
name=self.name,
**self.attributes
)
list_configs.append(include_path)
return list_configs
def forward(self, list_actions:list):
list_actions.append(generate_str(
ROOT_EXPORT / "templates/graph_ctor/maxpooling.jinja",
name=self.name,
inputs=parse_node_input(self.node.inputs()),
**self.attributes
))
return list_actions
@ExportSerialize.register(["MaxPooling1D", "MaxPooling2D", "MaxPooling3D"], ImplSpec(IOSpec(dtype.any)))
class MaxPooling(ExportNodeCpp):
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
self.config_template = str(
ROOT_EXPORT / "templates/attributes/maxpooling.jinja")
self.forward_template = str(
ROOT_EXPORT / "templates/graph_ctor/maxpooling.jinja")
self.include_list = ["aidge/operator/MaxPooling.hpp"]
self.kernels_to_copy = []
self.config_path = "include/attributes"
self.config_extension = "hpp"
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@ExportSerialize.register(["Pad1D", "Pad2D"], ImplSpec(IOSpec(dtype.any)))
class Pad(ExportNodeCpp):
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
self.config_template = str(
ROOT_EXPORT / "templates/attributes/pad.jinja")
self.forward_template = str(
ROOT_EXPORT /"templates/graph_ctor/pad.jinja")
self.include_list = ["aidge/operator/Pad.hpp"]
self.kernels_to_copy = []
self.config_path = "include/attributes"
self.config_extension = "hpp"
from aidge_core.aidge_export_aidge.utils import operator_register
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core import dtype, ExportNode, generate_file, generate_str
import numpy as np
from pathlib import Path
# Convert aidge datatype to C++ type
datatype_converter = {
dtype.float64 : "double",
dtype.float32 : "float",
dtype.float16 : "half_float::half",
dtype.int8 : "int8_t",
dtype.int16 : "int16_t",
dtype.int32 : "int32_t",
dtype.int64 : "int64_t",
dtype.uint8 : "uint8_t",
dtype.uint16 : "uint16_t",
dtype.uint32 : "uint32_t",
dtype.uint64 : "uint64_t"
}
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register("Producer")
class Producer(ExportNode):
@ExportSerialize.register("Producer", ImplSpec(IOSpec(dtype.any)))
class Producer(ExportNodeCpp):
"""
If there is a standardization of the export operators
then this class should be just a inheritance of ProducerCPP
"""
def __init__(self, node):
super().__init__(node)
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
child, in_idx = self.node.output(0)[0]
self.tensor_name = f"{child.name()}_{in_idx}"
self.values = np.array(self.operator.get_output(0))
def export(self, export_folder:Path, list_configs:list):
assert(len(self.node.output(0)) == 1)
include_path = f"parameters/{self.tensor_name}.hpp"
filepath = export_folder / f"include/{include_path}"
self.values = np.array(self.operator.get_output(0))
aidge_tensor = self.operator.get_output(0)
aidge_type = aidge_tensor.dtype()
if aidge_type in datatype_converter:
datatype = datatype_converter[aidge_type]
else:
raise RuntimeError(f"No conversion found for data type {aidge_type}.")
generate_file(
filepath,
ROOT_EXPORT / "templates/parameter.jinja",
dims = aidge_tensor.dims(),
data_t = datatype, # TODO : get data from producer
name = self.tensor_name,
values = str(aidge_tensor)
)
list_configs.append(include_path)
return list_configs
self.config_template = str(
ROOT_EXPORT / "templates/parameter.jinja")
self.forward_template = str(
ROOT_EXPORT / "templates/graph_ctor/producer.jinja")
self.attributes["tensor_name"] = f"{child.name()}_{in_idx}"
self.attributes["values"] = str(self.operator.get_output(0))
self.include_list = ["aidge/operator/Producer.hpp"]
self.kernels_to_copy = []
self.config_path = "include/attributes"
self.config_extension = "hpp"
def forward(self, list_actions:list):
list_actions.append(generate_str(
ROOT_EXPORT / "templates/graph_ctor/producer.jinja",
name=self.name,
tensor_name=self.tensor_name,
**self.attributes
))
return list_actions
from aidge_core.aidge_export_aidge.utils import operator_register, parse_node_input
from aidge_core import ExportNode, generate_str
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from pathlib import Path
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register("ReLU")
class ReLU(ExportNode):
def __init__(self, node):
super().__init__(node)
def export(self, export_folder:Path, list_configs:list):
return list_configs
def forward(self, list_actions:list):
list_actions.append(generate_str(
ROOT_EXPORT / "templates/graph_ctor/relu.jinja",
name=self.name,
inputs=parse_node_input(self.node.inputs()),
**self.attributes
))
return list_actions
@ExportSerialize.register("ReLU", ImplSpec(IOSpec(dtype.any)))
class ReLU(ExportNodeCpp):
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
self.config_template = ""
self.forward_template = str(
ROOT_EXPORT / "templates/graph_ctor/relu.jinja")
self.include_list = ["aidge/operator/ReLU.hpp"]
self.kernels_to_copy = []
from aidge_core.aidge_export_aidge.utils import operator_register, parse_node_input
from aidge_core import ExportNode, generate_str
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from pathlib import Path
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register("Sub")
class Sub(ExportNode):
def __init__(self, node):
super().__init__(node)
def export(self, export_folder:Path, list_configs:list):
return list_configs
def forward(self, list_actions:list):
list_actions.append(generate_str(
ROOT_EXPORT / "templates/graph_ctor/sub.jinja",
name=self.name,
inputs=parse_node_input(self.node.inputs()),
**self.attributes
))
return list_actions
@ExportSerialize.register("Sub", ImplSpec(IOSpec(dtype.any)))
class Sub(ExportNodeCpp):
def __init__(self, node, mem_info):
super().__init__(node, mem_info)
self.config_template = ""
self.forward_template = str(
ROOT_EXPORT / "templates/graph_ctor/sub.jinja")
self.include_list = ["aidge/operator/Sub.hpp"]
self.kernels_to_copy = []
from aidge_core.export_utils import ExportLib
from . import ROOT_EXPORT
import aidge_core
class ExportSerialize(ExportLib):
_name="export_serialize"
aidge_core.register_Tensor(["export_serialize", aidge_core.dtype.float32],
aidge_core.get_key_value_Tensor(["cpu", aidge_core.dtype.float32]))
#ifndef EXPORT_ATTRIBUTES_{{name|upper}}_H
#define EXPORT_ATTRIBUTES_{{name|upper}}_H
#define _{{name|upper}}_IN_CHANNELS {{InChannels}}
#define _{{name|upper}}_OUT_CHANNELS {{OutChannels}}
#define _{{name|upper}}_IN_CHANNELS {{in_chan[0]}}
#define _{{name|upper}}_OUT_CHANNELS {{out_chan[0]}}
{% for i in range(KernelDims|length) %}
#define _{{name|upper}}_KERNEL_{{i}} {{KernelDims[i]}}
{% for i in range(kernel_dims|length) %}
#define _{{name|upper}}_KERNEL_{{i}} {{kernel_dims[i]}}
{%- endfor %}
{% for i in range(StrideDims|length) %}
#define _{{name|upper}}_STRIDE_{{i}} {{StrideDims[i]}}
{% for i in range(stride_dims|length) %}
#define _{{name|upper}}_STRIDE_{{i}} {{stride_dims[i]}}
{%- endfor %}
{% for i in range(DilationDims|length) %}
#define _{{name|upper}}_DILATION_{{i}} {{DilationDims[i]}}
{% for i in range(dilation_dims|length) %}
#define _{{name|upper}}_DILATION_{{i}} {{dilation_dims[i]}}
{%- endfor %}
#endif /* EXPORT_ATTRIBUTES_{{name|upper}}_H */
#ifndef EXPORT_ATTRIBUTES_{{name|upper}}_H
#define EXPORT_ATTRIBUTES_{{name|upper}}_H
#define _{{name|upper}}_CHANNELS {{out_chan[0]}}
{% for i in range(kernel_dims|length) %}
#define _{{name|upper}}_KERNEL_{{i}} {{kernel_dims[i]}}
{%- endfor %}
{% for i in range(stride_dims|length) %}
#define _{{name|upper}}_STRIDE_{{i}} {{stride_dims[i]}}
{%- endfor %}
{% for i in range(dilation_dims|length) %}
#define _{{name|upper}}_DILATION_{{i}} {{dilation_dims[i]}}
{%- endfor %}
#endif /* EXPORT_ATTRIBUTES_{{name|upper}}_H */
#ifndef EXPORT_ATTRIBUTES_{{name|upper}}_H
#define EXPORT_ATTRIBUTES_{{name|upper}}_H
#define _{{name|upper}}_IN_CHANNELS {{InChannels}}
#define _{{name|upper}}_OUT_CHANNELS {{OutChannels}}
#define _{{name|upper}}_IN_CHANNELS {{in_chan[0]}}
#define _{{name|upper}}_OUT_CHANNELS {{out_chan[0]}}
#endif /* EXPORT_ATTRIBUTES_{{name|upper}}_H */
#ifndef EXPORT_ATTRIBUTES_{{name|upper}}_H
#define EXPORT_ATTRIBUTES_{{name|upper}}_H
{% for i in range(KernelDims|length) %}
#define _{{name|upper}}_KERNEL_{{i}} {{KernelDims[i]}}
{% for i in range(kernel_dims|length) %}
#define _{{name|upper}}_KERNEL_{{i}} {{kernel_dims[i]}}
{%- endfor %}
{% for i in range(StrideDims|length) %}
#define _{{name|upper}}_STRIDE_{{i}} {{StrideDims[i]}}
{% for i in range(stride_dims|length) %}
#define _{{name|upper}}_STRIDE_{{i}} {{stride_dims[i]}}
{%- endfor %}
#define _{{name|upper}}_CEIL_MODE {{CeilMode|int}}
#define _{{name|upper}}_CEIL_MODE {{ceil_mode|int}}
#endif /* EXPORT_ATTRIBUTES_{{name|upper}}_H */
#ifndef EXPORT_ATTRIBUTES_{{name|upper}}_H
#define EXPORT_ATTRIBUTES_{{name|upper}}_H
{%- set half_length = (begin_end_borders|length / 2)|int -%}
{% for i in range(half_length) %}
#define _{{name|upper}}_BEGIN_BORDERS_{{i}} {{begin_end_borders[2*i]}}
#define _{{name|upper}}_END_BORDERS_{{i}} {{begin_end_borders[2*i+1]}}
{%- endfor %}
#define _{{name|upper}}_BORDER_TYPE {{border_type|int}}
#define _{{name|upper}}_BORDER_VALUE {{border_value}}
#endif /* EXPORT_ATTRIBUTES_{{name|upper}}_H */
......@@ -17,7 +17,7 @@
/*** OPERATOR ATTRIBUTES & PARAMETERS ***/
{%- for header in headers %}
#include "{{ header }}"
#include "{{ header | replace('include/', '') }}"
{%- endfor %}
/*** HEADER ***/
......
{# NOTE: Trying a shorter notation like {%- for input in inputs if input[0] %}
will mess up loop.index as the input set up at None will not increment ! #}
{%- for input in inputs %}
{%- if input[0] %}
{{input[0]}}->addChild({{name}}, {{input[1]}}, {{loop.index - 1}}); {# NOTE: loop.index begin at 1 #}
{%- for input_node, out_id in node.inputs() %}
{%- if input_node %}
{{input_node.name()}}->addChild({{name}}, {{out_id}}, {{loop.index - 1}}); {# NOTE: loop.index begin at 1 #}
{%- endif %}
{%- endfor %}