46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
from typing import Set
|
|
from core.node import Node
|
|
from core.contracts import (
|
|
RequirementContract,
|
|
ImageDataContract,
|
|
FeatureTableContract
|
|
)
|
|
|
|
|
|
class ImageRequirement(RequirementContract):
|
|
data_type: str = "image"
|
|
modality: Set[str]
|
|
dim: Set[str]
|
|
requires_mask: bool = False
|
|
|
|
def is_satisfied_by(self, provided: ImageDataContract):
|
|
# Validate semantic compatibility
|
|
if provided.data_type != self.data_type:
|
|
raise ValueError("Data type mismatch")
|
|
|
|
if provided.modality not in self.modality:
|
|
raise ValueError("Modality mismatch")
|
|
|
|
if provided.dim not in self.dim:
|
|
raise ValueError("Dimension mismatch")
|
|
|
|
if self.requires_mask and not provided.has_mask:
|
|
raise ValueError("Mask is required but not provided")
|
|
|
|
|
|
class FeatureExtractor(Node):
|
|
def __init__(self):
|
|
super().__init__(
|
|
name="FeatureExtractor",
|
|
inputs={
|
|
"image": ImageRequirement(
|
|
modality={"CT"},
|
|
dim={"3D"},
|
|
requires_mask=False
|
|
)
|
|
},
|
|
outputs={
|
|
"features": FeatureTableContract()
|
|
}
|
|
)
|