void DebugOperatorFactory::RegisterDebugSchema()

in Tools/WinMLDashboard/src/cpp/DebugRunner/debug_cpu.cpp [295:391]


void DebugOperatorFactory::RegisterDebugSchema(winrt::com_ptr<IMLOperatorRegistry> registry)
{
	MLOperatorSetId operatorSetId;
	operatorSetId.domain = "";
	operatorSetId.version = TARGET_OPSET;

	MLOperatorSchemaDescription debugSchema;
	debugSchema.name = "Debug";
	debugSchema.operatorSetVersionAtLastChange = 1;

	MLOperatorSchemaEdgeDescription debugXInput;
	debugXInput.options = MLOperatorParameterOptions::Single;
	debugXInput.typeFormat = MLOperatorSchemaEdgeTypeFormat::Label;
	debugXInput.typeLabel = "T";

	std::vector<MLOperatorSchemaEdgeDescription> inputs{ debugXInput };
	debugSchema.inputs = inputs.data();
	debugSchema.inputCount = static_cast<uint32_t>(inputs.size());

	MLOperatorSchemaEdgeDescription debugXOutput;
	debugXOutput.options = MLOperatorParameterOptions::Single;
	debugXOutput.typeFormat = MLOperatorSchemaEdgeTypeFormat::Label;
	debugXOutput.typeLabel = "T";

	std::vector<MLOperatorSchemaEdgeDescription> outputs{ debugXOutput };
	debugSchema.outputs = outputs.data();
	debugSchema.outputCount = static_cast<uint32_t>(outputs.size());

	MLOperatorEdgeTypeConstrant typeConstraint;
	typeConstraint.typeLabel = "T";
	std::vector<MLOperatorEdgeDescription> allowedEdges
	{
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Float),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::UInt8),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Int8),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::UInt16),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Int16),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Int32),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Int64),
		//CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::String), documented as unsupported
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Bool),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Float16),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Double),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::UInt32),
		CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::UInt64),
		//CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Complex64), documented as unsupported
		//CreateEdgeDescriptor(MLOperatorEdgeType::Tensor, MLOperatorTensorDataType::Complex128) documented as unsupported
	};
	typeConstraint.allowedTypes = allowedEdges.data();
	typeConstraint.allowedTypeCount = static_cast<uint32_t>(allowedEdges.size());

	std::vector<MLOperatorEdgeTypeConstrant> typeConstraints{ typeConstraint };
	debugSchema.typeConstraints = typeConstraints.data();
	debugSchema.typeConstraintCount = static_cast<uint32_t>(typeConstraints.size());

	MLOperatorAttribute debugFilePathAttribute;
	debugFilePathAttribute.name = "file_path";
	debugFilePathAttribute.required = false;
	debugFilePathAttribute.type = MLOperatorAttributeType::String;

	MLOperatorAttribute debugFileTypeAttribute;
	debugFileTypeAttribute.name = "file_type";
	debugFileTypeAttribute.required = false;
	debugFileTypeAttribute.type = MLOperatorAttributeType::String;

	std::vector<MLOperatorAttribute> attributes{ debugFilePathAttribute, debugFileTypeAttribute };
	debugSchema.attributes = attributes.data();
	debugSchema.attributeCount = static_cast<uint32_t>(attributes.size());

	MLOperatorAttributeNameValue debugFilePathAttributeValue;
	debugFilePathAttributeValue.name = "file_path";
	debugFilePathAttributeValue.type = MLOperatorAttributeType::String;
	debugFilePathAttributeValue.valueCount = 1;
	static const char* defaultPaths[] = { "" };
	debugFilePathAttributeValue.strings = defaultPaths;

	MLOperatorAttributeNameValue debugFileTypeAttributeValue;
	debugFileTypeAttributeValue.name = "file_type";
	debugFileTypeAttributeValue.type = MLOperatorAttributeType::String;
	debugFileTypeAttributeValue.valueCount = 1;
	static const char* defaultTypes[] = { "png" };
	debugFileTypeAttributeValue.strings = defaultPaths;

	std::vector<MLOperatorAttributeNameValue> attributeDefaultValues{ debugFilePathAttributeValue, debugFileTypeAttributeValue };
	debugSchema.defaultAttributes = attributeDefaultValues.data();
	debugSchema.defaultAttributeCount = static_cast<uint32_t>(attributeDefaultValues.size());

	std::vector<const MLOperatorSchemaDescription*> schemas{ &debugSchema };
	registry->RegisterOperatorSetSchema(
		&operatorSetId,
		TARGET_OPSET /* baseline version */,
		schemas.data(),
		static_cast<uint32_t>(schemas.size()),
		nullptr,
		nullptr
	);
}