File-Based Evaluation: Python API¶
The file-based evaluation interfaces are normally used with Remote File-Based SAO, however they can also be used through ADORE's Python API. This can for example be useful if you want to do file and evaluation management yourself. This notebook demonstrates how to do file-based evaluation using the Python API.
The example that we will be using here is the Guidance, Navigation & Control (GNC) problem. Refer to the Evaluation Interfaces introduction for more details about this problem.
In [1]:
Copied!
# Load the example model: the GNC problem
import tempfile
import adore as ad
from gnc import GNCCalculator
from gnc_file_evaluation import GNCFileEvaluator
def get_evaluator(cls):
return cls.from_file('../assets/gnc.adore', save_to_project=True)
# Load the example model: the GNC problem
import tempfile
import adore as ad
from gnc import GNCCalculator
from gnc_file_evaluation import GNCFileEvaluator
def get_evaluator(cls):
return cls.from_file('../assets/gnc.adore', save_to_project=True)
JSON Serialization¶
In [2]:
Copied!
# Get a JSON serializer for the example problem
import json
from adore.optimization.api.file_based.direct_file_evaluators import \
JSONFileEvaluator
evaluator = get_evaluator(JSONFileEvaluator)
# Create a temporary working directory
with tempfile.TemporaryDirectory() as working_dir:
# Create a random architecture
architecture, _, _ = evaluator.get_architecture(
evaluator.get_random_design_vector())
# Generate the JSON file: this is the input for the evaluation
input_file_path = evaluator.evaluate_get_input(
architecture, working_dir=working_dir)
print(input_file_path)
# Print the serialized architecture
with open(input_file_path, 'rb') as fp:
data = json.load(fp)
arch_data = data['architecture']
# Clear some data for better printing
arch_data['designVars'] = []
print('Serialized architecture ["architecture"]:\n', json.dumps(arch_data, indent=4))
print('Output placeholders ["outputs"]:\n', json.dumps(data['outputs'], indent=4))
# Evaluate the input file to yield the output file
# Note: normally this would be done in an external process
output_file_path = f'{working_dir}/output.json'
GNCFileEvaluator.gnc_json_evaluate(input_file_path, output_file_path)
# Print the evaluated serialized architecture
with open(output_file_path, 'rb') as fp:
data = json.load(fp)
print('Evaluated output placeholders ["outputs"]:\n', json.dumps(data['outputs'], indent=4))
# Process evaluation outputs
objectives, constraints, architecture = evaluator.evaluate_process_output(
output_file_path)
print(f'Objectives: {objectives}')
# Get a JSON serializer for the example problem
import json
from adore.optimization.api.file_based.direct_file_evaluators import \
JSONFileEvaluator
evaluator = get_evaluator(JSONFileEvaluator)
# Create a temporary working directory
with tempfile.TemporaryDirectory() as working_dir:
# Create a random architecture
architecture, _, _ = evaluator.get_architecture(
evaluator.get_random_design_vector())
# Generate the JSON file: this is the input for the evaluation
input_file_path = evaluator.evaluate_get_input(
architecture, working_dir=working_dir)
print(input_file_path)
# Print the serialized architecture
with open(input_file_path, 'rb') as fp:
data = json.load(fp)
arch_data = data['architecture']
# Clear some data for better printing
arch_data['designVars'] = []
print('Serialized architecture ["architecture"]:\n', json.dumps(arch_data, indent=4))
print('Output placeholders ["outputs"]:\n', json.dumps(data['outputs'], indent=4))
# Evaluate the input file to yield the output file
# Note: normally this would be done in an external process
output_file_path = f'{working_dir}/output.json'
GNCFileEvaluator.gnc_json_evaluate(input_file_path, output_file_path)
# Print the evaluated serialized architecture
with open(output_file_path, 'rb') as fp:
data = json.load(fp)
print('Evaluated output placeholders ["outputs"]:\n', json.dumps(data['outputs'], indent=4))
# Process evaluation outputs
objectives, constraints, architecture = evaluator.evaluate_process_output(
output_file_path)
print(f'Objectives: {objectives}')
C:\Users\buss_js\AppData\Local\Temp\tmpepifjp2r\architecture.json
Serialized architecture ["architecture"]:
{
"id": 196,
"name": "Architecture #2",
"constraints": [],
"context": {
"id": 197,
"name": "System Context",
"elementId": 14,
"components": [],
"concepts": [],
"decompositions": [],
"functions": [],
"multiFulfillments": [],
"nonFulfillments": [],
"ports": [],
"qois": []
},
"decisions": [],
"designProblemId": 160,
"designVars": [],
"evalTimeStart": "2026-01-27T12:49:01.776342+00:00",
"feasible": true,
"final": true,
"objectives": [
{
"id": 270,
"name": "Failure Rate",
"ref": "failure-rate",
"archQoiId": 203,
"maximize": false,
"objectiveId": 194
},
{
"id": 271,
"name": "Mass",
"ref": "mass",
"archQoiId": 202,
"maximize": false,
"objectiveId": 195
}
],
"perfEvaluated": false,
"system": {
"id": 198,
"name": "System",
"elementId": 15,
"components": [
{
"id": 207,
"name": "Sensor",
"ref": "sensor",
"elementId": 21,
"fulfilledArchFunctionIds": [
200
],
"instances": [
{
"id": 208,
"name": "Sensor 0",
"elementId": 207,
"attributes": [
{
"id": 209,
"name": "Type",
"ref": "type",
"elementId": 27,
"values": [
"A"
]
}
],
"index": 0,
"inputPorts": [],
"outputPorts": [
{
"id": 210,
"name": "Data",
"elementId": 23,
"archPortId": 205,
"index": 0,
"targetIds": [
220
]
}
],
"qois": []
},
{
"id": 211,
"name": "Sensor 1",
"elementId": 207,
"attributes": [
{
"id": 212,
"name": "Type",
"ref": "type",
"elementId": 27,
"values": [
"B"
]
}
],
"index": 1,
"inputPorts": [],
"outputPorts": [
{
"id": 213,
"name": "Data",
"elementId": 23,
"archPortId": 205,
"index": 0,
"targetIds": [
224
]
}
],
"qois": []
},
{
"id": 214,
"name": "Sensor 2",
"elementId": 207,
"attributes": [
{
"id": 215,
"name": "Type",
"ref": "type",
"elementId": 27,
"values": [
"B"
]
}
],
"index": 2,
"inputPorts": [],
"outputPorts": [
{
"id": 216,
"name": "Data",
"elementId": 23,
"archPortId": 205,
"index": 0,
"targetIds": [
224
]
}
],
"qois": []
}
],
"neededArchFunctionIds": [],
"qois": []
},
{
"id": 217,
"name": "Computer",
"ref": "computer",
"elementId": 22,
"fulfilledArchFunctionIds": [
199
],
"instances": [
{
"id": 218,
"name": "Computer 0",
"elementId": 217,
"attributes": [
{
"id": 219,
"name": "Type",
"ref": "type",
"elementId": 41,
"values": [
"A"
]
}
],
"index": 0,
"inputPorts": [
{
"id": 220,
"name": "Data",
"elementId": 24,
"archPortId": 205,
"index": 0,
"targetIds": [
210
]
}
],
"outputPorts": [
{
"id": 221,
"name": "Command",
"elementId": 62,
"archPortId": 206,
"index": 0,
"targetIds": [
229,
235
]
}
],
"qois": []
},
{
"id": 222,
"name": "Computer 1",
"elementId": 217,
"attributes": [
{
"id": 223,
"name": "Type",
"ref": "type",
"elementId": 41,
"values": [
"A"
]
}
],
"index": 1,
"inputPorts": [
{
"id": 224,
"name": "Data",
"elementId": 24,
"archPortId": 205,
"index": 0,
"targetIds": [
213,
216
]
}
],
"outputPorts": [
{
"id": 225,
"name": "Command",
"elementId": 62,
"archPortId": 206,
"index": 0,
"targetIds": [
232
]
}
],
"qois": []
}
],
"neededArchFunctionIds": [],
"qois": []
},
{
"id": 226,
"name": "Actuator",
"ref": "actuator",
"elementId": 51,
"fulfilledArchFunctionIds": [
204
],
"instances": [
{
"id": 227,
"name": "Actuator 0",
"elementId": 226,
"attributes": [
{
"id": 228,
"name": "Type",
"ref": "type",
"elementId": 53,
"values": [
"B"
]
}
],
"index": 0,
"inputPorts": [
{
"id": 229,
"name": "Command",
"elementId": 63,
"archPortId": 206,
"index": 0,
"targetIds": [
221
]
}
],
"outputPorts": [],
"qois": []
},
{
"id": 230,
"name": "Actuator 1",
"elementId": 226,
"attributes": [
{
"id": 231,
"name": "Type",
"ref": "type",
"elementId": 53,
"values": [
"B"
]
}
],
"index": 1,
"inputPorts": [
{
"id": 232,
"name": "Command",
"elementId": 63,
"archPortId": 206,
"index": 0,
"targetIds": [
225
]
}
],
"outputPorts": [],
"qois": []
},
{
"id": 233,
"name": "Actuator 2",
"elementId": 226,
"attributes": [
{
"id": 234,
"name": "Type",
"ref": "type",
"elementId": 53,
"values": [
"C"
]
}
],
"index": 2,
"inputPorts": [
{
"id": 235,
"name": "Command",
"elementId": 63,
"archPortId": 206,
"index": 0,
"targetIds": [
221
]
}
],
"outputPorts": [],
"qois": []
}
],
"neededArchFunctionIds": [],
"qois": []
}
],
"concepts": [],
"decompositions": [
{
"id": 236,
"name": "GNC Functions",
"ref": "gnc-functions",
"elementId": 17,
"emergedArchFunctionId": 201,
"zoomedArchFunctionIds": [
200,
199,
204
]
}
],
"functions": [
{
"id": 199,
"name": "Determine Action",
"ref": "determine-action",
"elementId": 18,
"boundaryFunction": false,
"qois": [],
"type": "SOLUTION_SPECIFIC"
},
{
"id": 200,
"name": "Sense Orientation",
"ref": "sense-orientation",
"elementId": 19,
"boundaryFunction": false,
"qois": [],
"type": "SOLUTION_SPECIFIC"
},
{
"id": 201,
"name": "Provide GNC",
"ref": "provide-gnc",
"elementId": 16,
"boundaryFunction": true,
"qois": [
{
"id": 202,
"name": "Mass",
"ref": "mass",
"elementId": 48,
"evaluated": false,
"type": "OBJECTIVE",
"units": "kg"
},
{
"id": 203,
"name": "Failure Rate",
"ref": "failure-rate",
"elementId": 49,
"evaluated": false,
"type": "OBJECTIVE"
}
],
"type": "SOLUTION_NEUTRAL"
},
{
"id": 204,
"name": "Control Orientation",
"ref": "control-orientation",
"elementId": 50,
"boundaryFunction": false,
"qois": [],
"type": "SOLUTION_SPECIFIC"
}
],
"multiFulfillments": [],
"nonFulfillments": [],
"ports": [
{
"id": 205,
"name": "Data",
"ref": "data",
"elementId": 20
},
{
"id": 206,
"name": "Command",
"ref": "command",
"elementId": 61
}
],
"qois": [],
"index": 0,
"systems": []
}
}
Output placeholders ["outputs"]:
[
{
"archQoiId": 202,
"name": "Mass",
"ref": "mass",
"type": "OBJECTIVE",
"units": "kg",
"value": null
},
{
"archQoiId": 203,
"name": "Failure Rate",
"ref": "failure-rate",
"type": "OBJECTIVE",
"units": null,
"value": null
}
]
Evaluated output placeholders ["outputs"]:
[
{
"archQoiId": 202,
"name": "Mass",
"ref": "mass",
"type": "OBJECTIVE",
"units": "kg",
"value": 41.5
},
{
"archQoiId": 203,
"name": "Failure Rate",
"ref": "failure-rate",
"type": "OBJECTIVE",
"units": null,
"value": -7.124944540557525
}
]
Objectives: [-7.124944540557525, 41.5]
XML Serialization¶
In [3]:
Copied!
# Get an XML serializer for the example problem
from adore.optimization.api.file_based.direct_file_evaluators import \
XMLFileEvaluator
evaluator = get_evaluator(XMLFileEvaluator)
# Create a temporary working directory
with tempfile.TemporaryDirectory() as working_dir:
# Create a random architecture
architecture, _, _ = evaluator.get_architecture(
evaluator.get_random_design_vector())
# Generate the XML file: this is the input for the evaluation
input_file_path = evaluator.evaluate_get_input(
architecture, working_dir=working_dir)
print(input_file_path)
# We skip evaluation in this demo
output_file_path = input_file_path
# Process evaluation outputs
objectives, constraints, architecture = evaluator.evaluate_process_output(
output_file_path)
print(f'Objectives: {objectives}') # nan's because we didn't evaluate
# Get an XML serializer for the example problem
from adore.optimization.api.file_based.direct_file_evaluators import \
XMLFileEvaluator
evaluator = get_evaluator(XMLFileEvaluator)
# Create a temporary working directory
with tempfile.TemporaryDirectory() as working_dir:
# Create a random architecture
architecture, _, _ = evaluator.get_architecture(
evaluator.get_random_design_vector())
# Generate the XML file: this is the input for the evaluation
input_file_path = evaluator.evaluate_get_input(
architecture, working_dir=working_dir)
print(input_file_path)
# We skip evaluation in this demo
output_file_path = input_file_path
# Process evaluation outputs
objectives, constraints, architecture = evaluator.evaluate_process_output(
output_file_path)
print(f'Objectives: {objectives}') # nan's because we didn't evaluate
C:\Users\buss_js\AppData\Local\Temp\tmpujq6ycue\architecture.xml Objectives: [nan, nan]
XML Node Factory Evaluator¶
In [4]:
Copied!
from gnc_node_factory_evaluator import GNCNodeFactoryEvaluator
# Capture the output log to get information about the parsed
# factories and linkage to ADORE elements
# from adore.utils import capture_log
# capture_log()
# Get the XML Node Factory Evaluator for the example problem
from adore.optimization.api.file_based.file_factory_evaluator import \
XMLNodeFactoryEvaluator
evaluator: XMLNodeFactoryEvaluator = get_evaluator(XMLNodeFactoryEvaluator)
# Set the base file (can be a path or contents of the file as bytes)
evaluator.base_file = 'gnc_node_factory_evaluator_base.xml'
# Set the xpath to the factory settings
evaluator.settings_path = '/gnc/adore'
# Create a temporary working directory
with tempfile.TemporaryDirectory() as working_dir:
# Create a random architecture
architecture, _, _ = evaluator.get_architecture(
evaluator.get_random_design_vector())
# Generate the XML file: this is the input for the evaluation
input_file_path = evaluator.evaluate_get_input(
architecture, working_dir=working_dir)
print(input_file_path)
# Print contents of the file
with open(input_file_path, 'rb') as fp:
lines = fp.read().decode('utf-8').split('\n')
# Only print until the factories to save some space
for i, line in enumerate(lines):
if '<factories>' in line:
break
lines = lines[:i]
print('Input file:\n', '\n'.join(lines)+'\n')
# Evaluate the input file to yield the output file
# Note: normally this would be done in an external process
output_file_path = f'{working_dir}/output.xml'
GNCNodeFactoryEvaluator.gnc_xml_nfe_evaluate(
input_file_path, output_file_path)
# Process evaluation outputs
objectives, constraints, architecture = evaluator.evaluate_process_output(
output_file_path)
print(f'Objectives: {objectives}') # nan's because we didn't evaluate
from gnc_node_factory_evaluator import GNCNodeFactoryEvaluator
# Capture the output log to get information about the parsed
# factories and linkage to ADORE elements
# from adore.utils import capture_log
# capture_log()
# Get the XML Node Factory Evaluator for the example problem
from adore.optimization.api.file_based.file_factory_evaluator import \
XMLNodeFactoryEvaluator
evaluator: XMLNodeFactoryEvaluator = get_evaluator(XMLNodeFactoryEvaluator)
# Set the base file (can be a path or contents of the file as bytes)
evaluator.base_file = 'gnc_node_factory_evaluator_base.xml'
# Set the xpath to the factory settings
evaluator.settings_path = '/gnc/adore'
# Create a temporary working directory
with tempfile.TemporaryDirectory() as working_dir:
# Create a random architecture
architecture, _, _ = evaluator.get_architecture(
evaluator.get_random_design_vector())
# Generate the XML file: this is the input for the evaluation
input_file_path = evaluator.evaluate_get_input(
architecture, working_dir=working_dir)
print(input_file_path)
# Print contents of the file
with open(input_file_path, 'rb') as fp:
lines = fp.read().decode('utf-8').split('\n')
# Only print until the factories to save some space
for i, line in enumerate(lines):
if '' in line:
break
lines = lines[:i]
print('Input file:\n', '\n'.join(lines)+'\n')
# Evaluate the input file to yield the output file
# Note: normally this would be done in an external process
output_file_path = f'{working_dir}/output.xml'
GNCNodeFactoryEvaluator.gnc_xml_nfe_evaluate(
input_file_path, output_file_path)
# Process evaluation outputs
objectives, constraints, architecture = evaluator.evaluate_process_output(
output_file_path)
print(f'Objectives: {objectives}') # nan's because we didn't evaluate
C:\Users\buss_js\AppData\Local\Temp\tmp3ztxmenh/input.xml
Input file:
<gnc>
<!-- Data model for GNC problem -->
<sensors>
<sensor>
<type>B</type>
<targets>Computer_0_27e691</targets>
</sensor>
</sensors>
<computers>
<computer uID="Computer_0_27e691">
<type>C</type>
<targets>Actuator_0_3bd171</targets>
</computer>
</computers>
<actuators>
<actuator uID="Actuator_0_3bd171">
<type>B</type>
</actuator>
</actuators>
<performance>
<mass/>
<failureRate/>
</performance>
<!-- ADORE node factory settings -->
<adore>
Objectives: [-3.494885308997425, 21.5]
CPACS¶
In [5]:
Copied!
# Capture the output log to get information about the parsed
# factories and linkage to ADORE elements
# from adore.utils import capture_log
# capture_log()
# Get the CPACS evaluator for the example problem
from adore.optimization.api.file_based.cpacs.cpacs_evaluator import \
CPACSEvaluator
evaluator = CPACSEvaluator.from_file(
'../assets/cpacs_evaluation_workshop_result.adore', save_to_project=True)
# Set the CPACS base file (can be a path or contents of the file as bytes)
evaluator.base_file = 'cpacs_example_factory_solution.xml'
# Create a temporary working directory
with tempfile.TemporaryDirectory() as working_dir:
# Create a random architecture
architecture, _, _ = evaluator.get_architecture(
evaluator.get_random_design_vector())
# Generate the XML file: this is the input for the evaluation
input_file_path = evaluator.evaluate_get_input(
architecture, working_dir=working_dir)
print(input_file_path)
# Print contents of the file
with open(input_file_path, 'rb') as fp:
lines = fp.read().decode('utf-8').split('\n')
# # Only print until the factories to save some space
# for i, line in enumerate(lines):
# if '<factories>' in line:
# break
# lines = lines[:i]
print('Input file:\n', '\n'.join(lines)+'\n')
# The demo input file already contains some metrics
# Normally here the MDAO workflow is executed
output_file_path = input_file_path
# Process evaluation outputs
objectives, constraints, architecture = evaluator.evaluate_process_output(
output_file_path)
print(f'Objectives: {objectives}') # nan's because we didn't evaluate
# Capture the output log to get information about the parsed
# factories and linkage to ADORE elements
# from adore.utils import capture_log
# capture_log()
# Get the CPACS evaluator for the example problem
from adore.optimization.api.file_based.cpacs.cpacs_evaluator import \
CPACSEvaluator
evaluator = CPACSEvaluator.from_file(
'../assets/cpacs_evaluation_workshop_result.adore', save_to_project=True)
# Set the CPACS base file (can be a path or contents of the file as bytes)
evaluator.base_file = 'cpacs_example_factory_solution.xml'
# Create a temporary working directory
with tempfile.TemporaryDirectory() as working_dir:
# Create a random architecture
architecture, _, _ = evaluator.get_architecture(
evaluator.get_random_design_vector())
# Generate the XML file: this is the input for the evaluation
input_file_path = evaluator.evaluate_get_input(
architecture, working_dir=working_dir)
print(input_file_path)
# Print contents of the file
with open(input_file_path, 'rb') as fp:
lines = fp.read().decode('utf-8').split('\n')
# # Only print until the factories to save some space
# for i, line in enumerate(lines):
# if '' in line:
# break
# lines = lines[:i]
print('Input file:\n', '\n'.join(lines)+'\n')
# The demo input file already contains some metrics
# Normally here the MDAO workflow is executed
output_file_path = input_file_path
# Process evaluation outputs
objectives, constraints, architecture = evaluator.evaluate_process_output(
output_file_path)
print(f'Objectives: {objectives}') # nan's because we didn't evaluate
C:\Users\buss_js\AppData\Local\Temp\tmpg7ann1cw/input.xml
Input file:
<cpacs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../schema/cpacs_schema.xsd">
<header>
<name>Example system architecture</name>
<version>1.0.0</version>
</header>
<vehicles>
<aircraft>
<model uID="exampleAircraft">
<name>Example aircraft</name>
<engines>
<engine uID="Turboprop_0_149285">
<engineUID>engine</engineUID>
<name>Turboprop 0</name>
</engine>
<engine uID="Turboprop_0_45f763">
<engineUID>engine</engineUID>
<name>Turboprop 0</name>
</engine>
<engine uID="Turboprop_0_e550d3">
<engineUID>engine</engineUID>
<name>Turboprop 0</name>
</engine>
<engine uID="Turboprop_0_94960c">
<engineUID>engine</engineUID>
<name>Turboprop 0</name>
</engine>
</engines>
<systems>
<genericSystems>
<genericSystem uID="mySystem">
<name>Example system</name>
<components>
<component uID="Inverter_0_ceb8b2">
<name>Inverter 0</name>
</component>
<component uID="Electric_Motor_0_5e9fb9">
<systemElementUID>eMotor</systemElementUID>
<name>Electric Motor 0</name>
</component>
<component uID="Electric_Motor_0_b26f54">
<systemElementUID>eMotor</systemElementUID>
<name>Electric Motor 0</name>
</component>
<component uID="Electric_Motor_0_2e8d48">
<systemElementUID>eMotor</systemElementUID>
<name>Electric Motor 0</name>
</component>
<component uID="Turboshaft_0_f6c679">
<systemElementUID>turboshaft</systemElementUID>
<name>Turboshaft 0</name>
</component>
<component uID="Turboshaft_0_cd96dd">
<systemElementUID>turboshaft</systemElementUID>
<name>Turboshaft 0</name>
</component>
<component uID="Turboshaft_0_bcea47">
<systemElementUID>turboshaft</systemElementUID>
<name>Turboshaft 0</name>
</component>
<component uID="Turboshaft_0_62ca00">
<systemElementUID>turboshaft</systemElementUID>
<name>Turboshaft 0</name>
</component>
<component uID="Batteries_0_868f9f">
<systemElementUID>batteryPack</systemElementUID>
<name>Batteries 0</name>
</component>
</components>
</genericSystem>
</genericSystems>
</systems>
<systemArchitectures>
<systemArchitecture>
<name>Example system</name>
<systemType>generic</systemType>
<connections>
<connection uID="Turboprop_0_149285_to_ambient">
<name>Turboprop_0_149285_to_ambient</name>
<source>
<componentUID>Turboprop_0_149285</componentUID>
</source>
<target>
<externalElement>ambient</externalElement>
</target>
</connection>
<connection uID="Turboprop_0_45f763_to_ambient">
<name>Turboprop_0_45f763_to_ambient</name>
<source>
<componentUID>Turboprop_0_45f763</componentUID>
</source>
<target>
<externalElement>ambient</externalElement>
</target>
</connection>
<connection uID="Turboprop_0_e550d3_to_ambient">
<name>Turboprop_0_e550d3_to_ambient</name>
<source>
<componentUID>Turboprop_0_e550d3</componentUID>
</source>
<target>
<externalElement>ambient</externalElement>
</target>
</connection>
<connection uID="Turboprop_0_94960c_to_ambient">
<name>Turboprop_0_94960c_to_ambient</name>
<source>
<componentUID>Turboprop_0_94960c</componentUID>
</source>
<target>
<externalElement>ambient</externalElement>
</target>
</connection>
<connection uID="Electric_Motor_0_5e9fb9_to_Turboprop_0_149285">
<name>Electric_Motor_0_5e9fb9_to_Turboprop_0_149285</name>
<source>
<componentUID>Electric_Motor_0_5e9fb9</componentUID>
</source>
<target>
<componentUID>Turboprop_0_149285</componentUID>
</target>
</connection>
<connection uID="Turboshaft_0_f6c679_to_Turboprop_0_149285">
<name>Turboshaft_0_f6c679_to_Turboprop_0_149285</name>
<source>
<componentUID>Turboshaft_0_f6c679</componentUID>
</source>
<target>
<componentUID>Turboprop_0_149285</componentUID>
</target>
</connection>
<connection uID="Electric_Motor_0_b26f54_to_Turboprop_0_45f763">
<name>Electric_Motor_0_b26f54_to_Turboprop_0_45f763</name>
<source>
<componentUID>Electric_Motor_0_b26f54</componentUID>
</source>
<target>
<componentUID>Turboprop_0_45f763</componentUID>
</target>
</connection>
<connection uID="Turboshaft_0_cd96dd_to_Turboprop_0_45f763">
<name>Turboshaft_0_cd96dd_to_Turboprop_0_45f763</name>
<source>
<componentUID>Turboshaft_0_cd96dd</componentUID>
</source>
<target>
<componentUID>Turboprop_0_45f763</componentUID>
</target>
</connection>
<connection uID="Electric_Motor_0_2e8d48_to_Turboprop_0_e550d3">
<name>Electric_Motor_0_2e8d48_to_Turboprop_0_e550d3</name>
<source>
<componentUID>Electric_Motor_0_2e8d48</componentUID>
</source>
<target>
<componentUID>Turboprop_0_e550d3</componentUID>
</target>
</connection>
<connection uID="Turboshaft_0_bcea47_to_Turboprop_0_e550d3">
<name>Turboshaft_0_bcea47_to_Turboprop_0_e550d3</name>
<source>
<componentUID>Turboshaft_0_bcea47</componentUID>
</source>
<target>
<componentUID>Turboprop_0_e550d3</componentUID>
</target>
</connection>
<connection uID="Turboshaft_0_62ca00_to_Turboprop_0_94960c">
<name>Turboshaft_0_62ca00_to_Turboprop_0_94960c</name>
<source>
<componentUID>Turboshaft_0_62ca00</componentUID>
</source>
<target>
<componentUID>Turboprop_0_94960c</componentUID>
</target>
</connection>
</connections>
</systemArchitecture>
</systemArchitectures>
<analyses>
<massBreakdown>
<designMasses>
<mTOM uID="TOM">
<mass>116230.0</mass>
<location uID="posCoG_TOM">
<x>19.668</x>
<z>-0.22877</z>
</location>
<massInertia>
<Jxx>5018200.0</Jxx>
<Jyy>9102700.0</Jyy>
<Jzz>13920000.0</Jzz>
</massInertia>
</mTOM>
</designMasses>
</massBreakdown>
</analyses>
</model>
</aircraft>
<engines>
<engine uID="engine">
<name>Engine</name>
<rotors/>
</engine>
</engines>
<systemElements>
<electricMotors>
<electricMotor uID="eMotor">
<name>E-Motor</name>
<geometry>
<frustum>
<lowerRadiusX>1</lowerRadiusX>
<height>2</height>
<upperRadiusX>1</upperRadiusX>
</frustum>
</geometry>
</electricMotor>
</electricMotors>
<heatExchangers>
<heatExchanger uID="hx">
<name>Heat exchanger</name>
<geometry>
<parallelepiped>
<length>1</length>
<width>1</width>
<height>1</height>
</parallelepiped>
</geometry>
</heatExchanger>
</heatExchangers>
<gearBoxes>
<gearBox uID="gearbox">
<name>Gear box</name>
<geometry>
<frustum>
<lowerRadiusX>0.56419</lowerRadiusX>
<height>1</height>
<upperRadiusX>0.56419</upperRadiusX>
</frustum>
</geometry>
</gearBox>
</gearBoxes>
<gasTurbines>
<gasTurbine uID="turboshaft">
<name>Turboshaft</name>
<geometry>
<frustum>
<lowerRadiusX>1</lowerRadiusX>
<height>3</height>
<upperRadiusX>1</upperRadiusX>
</frustum>
</geometry>
</gasTurbine>
</gasTurbines>
<generators>
<generator uID="generator">
<name>Generator</name>
<geometry>
<frustum>
<lowerRadiusX>0.56419</lowerRadiusX>
<height>1</height>
<upperRadiusX>0.56419</upperRadiusX>
</frustum>
</geometry>
</generator>
</generators>
<batteries>
<battery uID="batteryPack">
<name>Battery Pack</name>
</battery>
</batteries>
</systemElements>
</vehicles>
<toolspecific>
<tool>
<name>ADORE</name>
<factories>
<componentFactory>
<element>
<!-- Automatically link to the "Inverter" component -->
<name>Inverter</name>
<match>auto</match>
</element>
</componentFactory>
</factories>
<metrics>
</metrics>
<archId>1180</archId>
</tool>
</toolspecific>
</cpacs>
Objectives: [116230.0]