Skip to content

Commit 2f92939

Browse files
Minimum limit addtition to the harware device validation
1 parent 9bc741c commit 2f92939

3 files changed

Lines changed: 80 additions & 20 deletions

File tree

code_generator.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
HybridOptimizationStatement,
2626
Identifier,
2727
InputStreamStatement,
28+
LayerDeclaration,
2829
Literal,
2930
MemoryLimitStatement,
3031
ModelStatement,
@@ -176,7 +177,7 @@ def visit_optimize_for_statement(self, node: OptimizeForStatement) -> Any:
176177
return None
177178

178179
def visit_memory_limit_statement(self, node: MemoryLimitStatement) -> Any:
179-
self.config["memory_limit"] = node.limit_mb
180+
self.config["memory_limit"] = node.limit_mb.value
180181
self.optimizations.append(f"Memory limit set to {node.limit_mb}MB")
181182
return None
182183

@@ -217,6 +218,25 @@ def visit_pipeline_statement(self, node: PipelineStatement) -> Any:
217218
self.config["pipeline_steps"] = node.steps
218219
return None
219220

221+
def visit_layer_declaration(self, node: LayerDeclaration) -> Any:
222+
"""Visit a layer declaration node."""
223+
# Extract layer information for code generation
224+
layer_info = {
225+
"name": node.name,
226+
"type": node.layer_type.value,
227+
"parameters": node.parameters,
228+
}
229+
230+
# Add to optimizations list for reporting
231+
self.optimizations.append(f"Layer {node.name}: {node.layer_type.value}")
232+
233+
# Store layer information in config for code generation
234+
if "layers" not in self.config:
235+
self.config["layers"] = []
236+
self.config["layers"].append(layer_info)
237+
238+
return None
239+
220240
def visit_literal(self, node: Literal) -> Any:
221241
return node.value
222242

edgeflow_ast.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ def accept(self, visitor: "ASTVisitor") -> Any:
236236
class MemoryLimitStatement(Statement):
237237
"""Represents a memory limit statement: memory_limit: 64 MB"""
238238

239-
limit_mb: int
239+
limit_mb: ConstrainedInt = field(default_factory=lambda: ConstrainedInt(64, 16, 10000))
240240

241241
def accept(self, visitor: "ASTVisitor") -> Any:
242242
return visitor.visit_memory_limit_statement(self)
@@ -323,11 +323,11 @@ def accept(self, visitor: "ASTVisitor") -> Any:
323323
class LayerDeclaration(Statement):
324324
"""Base class for layer declarations with type validation."""
325325

326-
name: str = field()
327-
layer_type: LayerType = field()
326+
name: str = ""
327+
layer_type: LayerType = LayerType.CONV2D
328328
parameters: Dict[str, Any] = field(default_factory=dict)
329-
source_line: Optional[int] = field(default=None)
330-
source_column: Optional[int] = field(default=None)
329+
source_line: Optional[int] = None
330+
source_column: Optional[int] = None
331331

332332
def __post_init__(self):
333333
"""Post-initialization hook for subclasses."""
@@ -345,12 +345,12 @@ def validate_parameters(self) -> List[str]:
345345
class Conv2DDeclaration(LayerDeclaration):
346346
"""Conv2D layer with type-constrained parameters."""
347347

348-
filters: ConstrainedInt = field()
349-
kernel_size: KernelSize = field()
348+
filters: ConstrainedInt = field(default_factory=lambda: ConstrainedInt(32))
349+
kernel_size: KernelSize = field(default_factory=lambda: KernelSize(3))
350350
strides: StrideValue = field(default_factory=lambda: StrideValue(1))
351-
padding: PaddingType = field(default=PaddingType.VALID)
352-
activation: ActivationType = field(default=ActivationType.LINEAR)
353-
use_bias: bool = field(default=True)
351+
padding: PaddingType = PaddingType.VALID
352+
activation: ActivationType = ActivationType.LINEAR
353+
use_bias: bool = True
354354

355355
def __post_init__(self):
356356
super().__post_init__()
@@ -392,9 +392,9 @@ def validate_parameters(self) -> List[str]:
392392
class DenseDeclaration(LayerDeclaration):
393393
"""Dense layer with type-constrained parameters."""
394394

395-
units: ConstrainedInt = field()
396-
activation: ActivationType = field(default=ActivationType.LINEAR)
397-
use_bias: bool = field(default=True)
395+
units: ConstrainedInt = field(default_factory=lambda: ConstrainedInt(128))
396+
activation: ActivationType = ActivationType.LINEAR
397+
use_bias: bool = True
398398

399399
def __post_init__(self):
400400
super().__post_init__()
@@ -421,7 +421,7 @@ def validate_parameters(self) -> List[str]:
421421
class DropoutDeclaration(LayerDeclaration):
422422
"""Dropout layer with type-constrained parameters."""
423423

424-
rate: DropoutRate = field()
424+
rate: DropoutRate = field(default_factory=lambda: DropoutRate(0.5))
425425

426426
def __post_init__(self):
427427
super().__post_init__()
@@ -444,9 +444,9 @@ def validate_parameters(self) -> List[str]:
444444
class MaxPool2DDeclaration(LayerDeclaration):
445445
"""MaxPool2D layer with type-constrained parameters."""
446446

447-
pool_size: Union[int, Tuple[int, int]] = field()
448-
strides: Optional[StrideValue] = field(default=None)
449-
padding: PaddingType = field(default=PaddingType.VALID)
447+
pool_size: Union[int, Tuple[int, int]] = 2
448+
strides: Optional[StrideValue] = None
449+
padding: PaddingType = PaddingType.VALID
450450

451451
def __post_init__(self):
452452
super().__post_init__()
@@ -697,7 +697,7 @@ def create_program_from_dict(config: Dict[str, Any]) -> Program:
697697
statements.append(OptimizeForStatement(goal=config["optimize_for"]))
698698

699699
if "memory_limit" in config:
700-
statements.append(MemoryLimitStatement(limit_mb=config["memory_limit"]))
700+
statements.append(MemoryLimitStatement(limit_mb=ConstrainedInt(config["memory_limit"], 16, 10000)))
701701

702702
if "enable_fusion" in config:
703703
statements.append(FusionStatement(enabled=config["enable_fusion"]))
@@ -749,7 +749,7 @@ def print_ast(node: ASTNode, indent: int = 0) -> str:
749749
elif isinstance(node, OptimizeForStatement):
750750
result.append(f"{prefix}OptimizeForStatement(goal='{node.goal}')")
751751
elif isinstance(node, MemoryLimitStatement):
752-
result.append(f"{prefix}MemoryLimitStatement(limit_mb={node.limit_mb})")
752+
result.append(f"{prefix}MemoryLimitStatement(limit_mb={node.limit_mb.value})")
753753
elif isinstance(node, FusionStatement):
754754
result.append(f"{prefix}FusionStatement(enabled={node.enabled})")
755755
elif isinstance(node, FrameworkStatement):

fast_compile.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,5 +714,45 @@ def demo_fast_compiler():
714714
print(f" • Intelligent optimization suggestions generated")
715715

716716

717+
def fast_compile_config(config: Dict[str, Any]) -> FastCompileResult:
718+
"""
719+
Fast compile a configuration for immediate feedback.
720+
721+
Args:
722+
config: EdgeFlow configuration dictionary
723+
724+
Returns:
725+
FastCompileResult with validation and performance estimates
726+
"""
727+
try:
728+
from edgeflow_ir import IRBuilder
729+
730+
# Build IR graph from config
731+
ir_builder = IRBuilder()
732+
ir_graph = ir_builder.build_from_config(config)
733+
734+
# Get target device and quantization from config
735+
target_device = config.get("target_device", "mobile")
736+
quantization = config.get("quantize", "float32")
737+
738+
# Initialize fast compiler and run compilation
739+
compiler = EdgeFlowFastCompiler()
740+
result = compiler.fast_compile(ir_graph, target_device, quantization)
741+
742+
return result
743+
744+
except Exception as e:
745+
logger.error(f"Fast compile config failed: {e}")
746+
return FastCompileResult(
747+
success=False,
748+
errors=[f"Configuration compilation failed: {str(e)}"],
749+
warnings=[],
750+
performance_metrics=None,
751+
compile_time_ms=0.0,
752+
device_compatibility={},
753+
optimization_suggestions=[],
754+
)
755+
756+
717757
if __name__ == "__main__":
718758
demo_fast_compiler()

0 commit comments

Comments
 (0)