Files
Atomizer/optimization_engine/schemas/optimization_config_schema.json
Anto01 155f5a8522 feat: Add configuration validation system for MVP stability (Phase 1.2)
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>
2025-11-24 09:21:55 -05:00

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')"
}
}
}
}
}
}
}