Implements JSON Schema validation for optimization configurations to ensure
consistency across all studies and prevent configuration errors.
Added:
- optimization_engine/schemas/optimization_config_schema.json
- Comprehensive schema for Protocol 10 & 11 configurations
- Validates objectives, constraints, design variables, simulation settings
- Enforces standard field names (goal, bounds, parameter, threshold)
- optimization_engine/config_manager.py
- ConfigManager class with schema validation
- CLI tool: python config_manager.py <config.json>
- Type-safe accessor methods for config elements
- Custom validations: bounds check, multi-objective consistency, location check
- optimization_engine/schemas/README.md
- Complete documentation of standard configuration format
- Validation examples and common error fixes
- Migration guidance for legacy configs
- docs/07_DEVELOPMENT/Phase_1_2_Implementation_Plan.md
- Detailed implementation plan for remaining Phase 1.2 tasks
- Migration tool design, integration guide, testing plan
Testing:
- Validated drone_gimbal_arm_optimization config successfully
- ConfigManager works with drone_gimbal format (new standard)
- Identifies legacy format issues in bracket studies
Standards Established:
- Configuration location: studies/{name}/1_setup/
- Objective direction: "goal" not "type"
- Design var bounds: "bounds": [min, max] not "min"/"max"
- Design var name: "parameter" not "name"
- Constraint threshold: "threshold" not "value"
Next Steps (Phase 1.2.1+):
- Config migration tool for legacy studies
- Integration with run_optimization.py
- Update create-study Claude skill with schema reference
- Migrate bracket studies to new format
Relates to: Phase 1.2 MVP Development Plan
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
280 lines
8.2 KiB
JSON
280 lines
8.2 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"$id": "https://atomizer.io/schemas/optimization_config.json",
|
|
"title": "Atomizer Optimization Configuration",
|
|
"description": "Schema for Atomizer optimization study configuration files",
|
|
"type": "object",
|
|
"required": ["study_name", "description", "optimization_settings", "design_variables", "objectives", "simulation"],
|
|
|
|
"properties": {
|
|
"study_name": {
|
|
"type": "string",
|
|
"description": "Unique identifier for this optimization study",
|
|
"pattern": "^[a-z0-9_]+$",
|
|
"minLength": 3,
|
|
"maxLength": 100
|
|
},
|
|
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Brief description of the optimization problem",
|
|
"minLength": 10,
|
|
"maxLength": 500
|
|
},
|
|
|
|
"engineering_context": {
|
|
"type": "string",
|
|
"description": "Real-world engineering scenario and requirements (optional but recommended)",
|
|
"minLength": 20
|
|
},
|
|
|
|
"optimization_settings": {
|
|
"type": "object",
|
|
"required": ["protocol", "n_trials"],
|
|
"properties": {
|
|
"protocol": {
|
|
"type": "string",
|
|
"description": "Optimization protocol to use",
|
|
"enum": [
|
|
"protocol_10_single_objective",
|
|
"protocol_11_multi_objective",
|
|
"legacy"
|
|
]
|
|
},
|
|
"n_trials": {
|
|
"type": "integer",
|
|
"description": "Number of optimization trials to run",
|
|
"minimum": 1,
|
|
"maximum": 10000
|
|
},
|
|
"sampler": {
|
|
"type": "string",
|
|
"description": "Optuna sampler algorithm",
|
|
"enum": ["TPESampler", "NSGAIISampler", "CmaEsSampler", "RandomSampler"]
|
|
},
|
|
"pruner": {
|
|
"type": ["string", "null"],
|
|
"description": "Optuna pruner (null for no pruning)",
|
|
"enum": ["MedianPruner", "HyperbandPruner", "SuccessiveHalvingPruner", null]
|
|
},
|
|
"timeout_per_trial": {
|
|
"type": "integer",
|
|
"description": "Maximum time per trial in seconds",
|
|
"minimum": 60,
|
|
"maximum": 7200
|
|
}
|
|
}
|
|
},
|
|
|
|
"design_variables": {
|
|
"type": "array",
|
|
"description": "List of design variables (NX expressions) to optimize",
|
|
"minItems": 1,
|
|
"maxItems": 50,
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["parameter", "bounds", "description"],
|
|
"properties": {
|
|
"parameter": {
|
|
"type": "string",
|
|
"description": "NX expression name",
|
|
"pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$"
|
|
},
|
|
"bounds": {
|
|
"type": "array",
|
|
"description": "[min, max] bounds for this parameter",
|
|
"minItems": 2,
|
|
"maxItems": 2,
|
|
"items": {
|
|
"type": "number"
|
|
}
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "What this parameter controls"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"objectives": {
|
|
"type": "array",
|
|
"description": "Optimization objectives (1 for single-objective, 2-3 for multi-objective)",
|
|
"minItems": 1,
|
|
"maxItems": 3,
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name", "goal", "weight", "description", "extraction"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Objective name (e.g., 'mass', 'stiffness', 'frequency')"
|
|
},
|
|
"goal": {
|
|
"type": "string",
|
|
"description": "Optimization direction",
|
|
"enum": ["minimize", "maximize"]
|
|
},
|
|
"weight": {
|
|
"type": "number",
|
|
"description": "Relative importance weight",
|
|
"minimum": 0,
|
|
"maximum": 100
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "What this objective measures"
|
|
},
|
|
"target": {
|
|
"type": ["number", "null"],
|
|
"description": "Target value (optional)"
|
|
},
|
|
"extraction": {
|
|
"$ref": "#/definitions/extraction_spec"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"constraints": {
|
|
"type": "array",
|
|
"description": "Constraints that must be satisfied",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name", "type", "threshold", "description", "extraction"],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Constraint name"
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Constraint type",
|
|
"enum": ["less_than", "greater_than", "equal_to"]
|
|
},
|
|
"threshold": {
|
|
"type": "number",
|
|
"description": "Threshold value for constraint"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "Engineering justification for this constraint"
|
|
},
|
|
"extraction": {
|
|
"$ref": "#/definitions/extraction_spec"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"simulation": {
|
|
"type": "object",
|
|
"required": ["model_file", "sim_file", "fem_file", "solver"],
|
|
"properties": {
|
|
"model_file": {
|
|
"type": "string",
|
|
"description": "NX Part file name (e.g., 'Beam.prt')",
|
|
"pattern": "\\.(prt|PRT)$"
|
|
},
|
|
"sim_file": {
|
|
"type": "string",
|
|
"description": "NX Simulation file name (e.g., 'Beam_sim1.sim')",
|
|
"pattern": "\\.(sim|SIM)$"
|
|
},
|
|
"fem_file": {
|
|
"type": "string",
|
|
"description": "FEM mesh file name (e.g., 'Beam_fem1.fem')",
|
|
"pattern": "\\.(fem|FEM)$"
|
|
},
|
|
"solver": {
|
|
"type": "string",
|
|
"description": "FEA solver type",
|
|
"enum": ["nastran", "NX_Nastran"]
|
|
},
|
|
"analysis_types": {
|
|
"type": "array",
|
|
"description": "Types of analysis required",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["static", "modal", "thermal", "buckling"]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"reporting": {
|
|
"type": "object",
|
|
"description": "Result reporting settings (optional)",
|
|
"properties": {
|
|
"generate_plots": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"save_incremental": {
|
|
"type": "boolean",
|
|
"default": true
|
|
},
|
|
"llm_summary": {
|
|
"type": "boolean",
|
|
"default": false,
|
|
"description": "Generate LLM summaries (experimental, requires API setup)"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
"definitions": {
|
|
"extraction_spec": {
|
|
"type": "object",
|
|
"required": ["action", "domain", "params"],
|
|
"properties": {
|
|
"action": {
|
|
"type": "string",
|
|
"description": "Extractor function to call",
|
|
"enum": [
|
|
"extract_mass",
|
|
"extract_stress",
|
|
"extract_displacement",
|
|
"extract_frequency",
|
|
"extract_stiffness"
|
|
]
|
|
},
|
|
"domain": {
|
|
"type": "string",
|
|
"description": "Extraction domain (always 'result_extraction' for MVP)",
|
|
"enum": ["result_extraction"]
|
|
},
|
|
"params": {
|
|
"type": "object",
|
|
"description": "Parameters for the extractor function",
|
|
"required": ["result_type"],
|
|
"properties": {
|
|
"result_type": {
|
|
"type": "string",
|
|
"description": "Type of result to extract",
|
|
"enum": ["mass", "stress", "displacement", "frequency", "stiffness"]
|
|
},
|
|
"metric": {
|
|
"type": "string",
|
|
"description": "Specific metric to extract (e.g., 'max', 'total', 'max_von_mises')"
|
|
},
|
|
"mode_number": {
|
|
"type": "integer",
|
|
"description": "Mode number for frequency extraction",
|
|
"minimum": 1
|
|
},
|
|
"subcase": {
|
|
"type": "integer",
|
|
"description": "Subcase number for result extraction"
|
|
},
|
|
"element_type": {
|
|
"type": "string",
|
|
"description": "Element type for stress extraction (e.g., 'CTETRA', 'CHEXA')"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|