/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.optimizer.gui.properties.commands;
import java.util.HashMap;
import java.util.Map;
import de.rcenvironment.components.optimizer.common.OptimizerComponentConstants;
import de.rcenvironment.core.component.api.ComponentConstants;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinition;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.EndpointType;
import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.AddDynamicEndpointCommand;
import de.rcenvironment.core.gui.workflow.editor.properties.Refreshable;
/**
* Adds a input to a Optimizer-{@link WorkflowNode}.
*
* @author Sascha Zur
*/
public class OptimizerAddDynamicEndpointCommand extends AddDynamicEndpointCommand {
private static final String DESIGN_VARIABLE = "Design";
private final EndpointType direction;
private final boolean hasGradient;
private final Map<String, String> gradientMetadata = new HashMap<>();
public OptimizerAddDynamicEndpointCommand(EndpointType direction, String name, String id, DataType type,
Map<String, String> metaData, Refreshable... refreshable) {
super(direction, id, name, type, metaData, refreshable);
this.direction = direction;
hasGradient = Boolean.parseBoolean(metaData.get(OptimizerComponentConstants.HAS_GRADIENT));
}
@Override
public void execute() {
super.execute();
EndpointDescription endpoint = endpointDescManager.getEndpointDescription(name);
final WorkflowNode workflowNode = getWorkflowNode();
for (String key : metaData.keySet()) {
if (key.equals(OptimizerComponentConstants.METADATA_VECTOR_SIZE)
|| key.startsWith(ComponentConstants.INPUT_METADATA_KEY_INPUT_DATUM_HANDLING)
|| key.startsWith(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT)) {
gradientMetadata.put(key, metaData.get(key));
} else {
gradientMetadata.put(key, "-");
}
gradientMetadata.put(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT,
EndpointDefinition.InputExecutionContraint.Required.name());
}
switch (direction) {
case INPUT:
if (hasGradient) {
for (EndpointDescription e : workflowNode.getOutputDescriptionsManager().getDynamicEndpointDescriptions()) {
if (e.getDynamicEndpointIdentifier().equals(DESIGN_VARIABLE)) {
endpointDescManager.addDynamicEndpointDescription(OptimizerComponentConstants.ID_GRADIENTS,
OptimizerDynamicEndpointCommandHelper.createGradientChannelName(name, e.getName()), e.getDataType(),
gradientMetadata);
}
}
}
OptimizerDynamicEndpointCommandHelper.addLowerAndUpperBoundsEndpoints(name, type, metaData, workflowNode);
break;
case OUTPUT:
for (EndpointDescription function : workflowNode.getInputDescriptionsManager().getDynamicEndpointDescriptions()) {
if (function.getMetaDataValue(OptimizerComponentConstants.HAS_GRADIENT) != null
&& Boolean.parseBoolean(function.getMetaDataValue(OptimizerComponentConstants.HAS_GRADIENT))) {
for (String key : metaData.keySet()) {
if (key.equals(OptimizerComponentConstants.METADATA_VECTOR_SIZE)
|| key.startsWith(ComponentConstants.INPUT_METADATA_KEY_INPUT_DATUM_HANDLING)
|| key.startsWith(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT)) {
gradientMetadata.put(key, metaData.get(key));
} else {
gradientMetadata.put(key, "-");
}
gradientMetadata.put(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT,
EndpointDefinition.InputExecutionContraint.Required.name());
}
workflowNode.getInputDescriptionsManager().addDynamicEndpointDescription(OptimizerComponentConstants.ID_GRADIENTS,
OptimizerDynamicEndpointCommandHelper.createGradientChannelName(function.getName(), name),
type, gradientMetadata);
}
}
Map<String, String> optimalMetaData = new HashMap<>();
optimalMetaData.putAll(metaData);
endpointDescManager.addDynamicEndpointDescription(OptimizerComponentConstants.ID_OPTIMA, name
+ OptimizerComponentConstants.OPTIMUM_VARIABLE_SUFFIX, type,
optimalMetaData);
if ((metaData.get(OptimizerComponentConstants.META_HAS_STARTVALUE) == null
&& metaData.get(OptimizerComponentConstants.META_STARTVALUE).isEmpty())
|| (metaData.get(OptimizerComponentConstants.META_HAS_STARTVALUE) != null
&& !Boolean.parseBoolean(metaData.get(OptimizerComponentConstants.META_HAS_STARTVALUE)))) {
Map<String, String> startValueMetaData = new HashMap<>();
startValueMetaData.put(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT,
EndpointDefinition.InputExecutionContraint.Required.name());
workflowNode.getInputDescriptionsManager().addDynamicEndpointDescription(OptimizerComponentConstants.ID_STARTVALUES,
name + OptimizerComponentConstants.STARTVALUE_SIGNATURE, type,
startValueMetaData);
}
if ((endpoint.getMetaDataValue(OptimizerComponentConstants.META_USE_STEP) != null
&& !endpoint.getMetaDataValue(OptimizerComponentConstants.META_USE_STEP).isEmpty())) {
if (endpoint.getMetaDataValue(OptimizerComponentConstants.META_USE_UNIFIED_STEP) != null
&& !Boolean.parseBoolean(endpoint.getMetaDataValue(OptimizerComponentConstants.META_USE_UNIFIED_STEP))) {
Map<String, String> stepValueMetaData = new HashMap<>();
stepValueMetaData.put(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT,
EndpointDefinition.InputExecutionContraint.Required.name());
workflowNode.getInputDescriptionsManager().addDynamicEndpointDescription(OptimizerComponentConstants.ID_STARTVALUES,
name + OptimizerComponentConstants.STEP_VALUE_SIGNATURE, type, stepValueMetaData);
}
}
OptimizerDynamicEndpointCommandHelper.addLowerAndUpperBoundsEndpoints(name, type, metaData, workflowNode);
break;
default:
throw new RuntimeException();
}
if (refreshable != null) {
for (Refreshable r : refreshable) {
r.refresh();
}
}
}
@Override
public void undo() {
super.undo();
final WorkflowNode workflowNode = getWorkflowNode();
switch (direction) {
case INPUT:
if (hasGradient) {
for (EndpointDescription e : workflowNode.getOutputDescriptionsManager().getDynamicEndpointDescriptions()) {
if (e.getDynamicEndpointIdentifier().equals(DESIGN_VARIABLE)) {
endpointDescManager.removeDynamicEndpointDescription(
OptimizerDynamicEndpointCommandHelper.createGradientChannelName(name, e.getName()));
}
}
}
OptimizerDynamicEndpointCommandHelper.removeUpperLowerBoundsEndpoints(name, metaData, workflowNode);
break;
case OUTPUT:
for (EndpointDescription function : workflowNode.getInputDescriptionsManager().getDynamicEndpointDescriptions()) {
if (!workflowNode.getInputDescriptionsManager().isValidEndpointName(
OptimizerDynamicEndpointCommandHelper.createGradientChannelName(function.getName(), name))) {
workflowNode.getInputDescriptionsManager().removeDynamicEndpointDescription(
OptimizerDynamicEndpointCommandHelper.createGradientChannelName(function.getName(), name));
}
}
endpointDescManager.removeDynamicEndpointDescription(name + OptimizerComponentConstants.OPTIMUM_VARIABLE_SUFFIX);
if ((metaData.get(OptimizerComponentConstants.META_HAS_STARTVALUE) == null
&& metaData.get(OptimizerComponentConstants.META_STARTVALUE).isEmpty())
|| (metaData.get(OptimizerComponentConstants.META_HAS_STARTVALUE) != null
&& !Boolean.parseBoolean(metaData.get(OptimizerComponentConstants.META_HAS_STARTVALUE)))) {
workflowNode.getInputDescriptionsManager().removeDynamicEndpointDescription(
name + OptimizerComponentConstants.STARTVALUE_SIGNATURE);
}
if ((metaData.get(OptimizerComponentConstants.META_USE_STEP) != null
&& !metaData.get(OptimizerComponentConstants.META_USE_STEP).isEmpty())) {
if (metaData.get(OptimizerComponentConstants.META_USE_UNIFIED_STEP) != null
&& !Boolean.parseBoolean(metaData.get(OptimizerComponentConstants.META_USE_UNIFIED_STEP))) {
workflowNode.getInputDescriptionsManager().removeDynamicEndpointDescription(
name + OptimizerComponentConstants.STEP_VALUE_SIGNATURE);
}
}
OptimizerDynamicEndpointCommandHelper.removeUpperLowerBoundsEndpoints(name, metaData, workflowNode);
break;
default:
throw new RuntimeException();
}
if (refreshable != null) {
for (Refreshable r : refreshable) {
r.refresh();
}
}
}
}