From 3f243ac8fee02f6ede94ed2d0f75aea1d39b839b Mon Sep 17 00:00:00 2001 From: Mathias Paulin Date: Fri, 10 Feb 2023 17:35:02 +0100 Subject: [PATCH] [unittests][dataflow] improve coverage for graph building and serialization --- tests/unittest/Dataflow/graph.cpp | 230 ++++++++++-------- tests/unittest/Dataflow/serialization.cpp | 15 +- .../unittest/data/Dataflow/ExampleGraph.json | 143 +++++------ 3 files changed, 206 insertions(+), 182 deletions(-) diff --git a/tests/unittest/Dataflow/graph.cpp b/tests/unittest/Dataflow/graph.cpp index a5442e44fd4..c259e019b2c 100644 --- a/tests/unittest/Dataflow/graph.cpp +++ b/tests/unittest/Dataflow/graph.cpp @@ -22,7 +22,7 @@ void inspectGraph( const DataflowGraph& g ) { std::cout << "Nodes of the graph " << g.getInstanceName() << " (" << nodes->size() << ") :\n"; for ( const auto& n : *( nodes ) ) { std::cout << "\t\"" << n->getInstanceName() << "\" of type \"" << n->getTypeName() - << "\"\n"; + << "\" with uuid \"" << n->getUuid() << "\n"; // Inspect input, output and interfaces of the node std::cout << "\t\tInput ports :\n"; for ( const auto& p : n->getInputs() ) { @@ -82,174 +82,211 @@ void inspectGraph( const DataflowGraph& g ) { TEST_CASE( "Dataflow/Core/Graph", "[Dataflow][Core][Graph]" ) { SECTION( "Creation of a graph" ) { DataflowGraph g( "Test Graph" ); + // Test not a json error detection auto result = g.loadFromJson( "data/Dataflow/NotAJsonFile.json" ); REQUIRE( !result ); + // Test loading empty graph nlohmann::json emptyJson = {}; result = g.fromJson( emptyJson ); REQUIRE( result ); + + // missing identification of the graph (either id or instance) nlohmann::json noId = { { "model", { "name", "Core DataflowGraph" } } }; result = g.fromJson( noId ); REQUIRE( !result ); g.destroy(); - nlohmann::json noModel = { { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" } }; + // missing model of the graph + nlohmann::json noModel = { { "instance", "No model in this node" } }; result = g.fromJson( noModel ); REQUIRE( !result ); g.destroy(); - nlohmann::json noGraph = { { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + // missing instance data --> loads an empty graph + nlohmann::json noGraph = { { "instance", "Missing instance data for model" }, { "model", { "name", "Core DataflowGraph" } } }; result = g.fromJson( noGraph ); REQUIRE( result ); g.destroy(); + // Requesting unknown factory nlohmann::json wrongFactory = { - { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + { "instance", "unknown factory" }, { "model", - { { "instance", "Test Graph Inline" }, - { "name", "Core DataflowGraph" }, + { { "name", "Core DataflowGraph" }, { "graph", { { "factories", { "NotAFactory" } } } } } } }; result = g.fromJson( wrongFactory ); REQUIRE( !result ); g.destroy(); - nlohmann::json NotANode = { { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, - { "model", - { { "instance", "Test Graph Inline" }, - { "name", "Core DataflowGraph" }, - { "graph", - { { "factories", {} }, - { "nodes", - { { { "id", "tototo" }, - { "model", - { { "instance", "NotANode" }, - { "name", "NotANode" } } } } } } } } } } }; - result = g.fromJson( NotANode ); + // trying to instance an unknown node type + nlohmann::json NotANode = { + { "instance", "graph with unknown node" }, + { "model", + { { "name", "Core DataflowGraph" }, + { "graph", + { { "factories", {} }, + { "nodes", + { { { "instance", "NotANode" }, + { "model", { { "name", "NotANode" } } } } } } } } } } }; + result = g.fromJson( NotANode ); REQUIRE( !result ); g.destroy(); - nlohmann::json wrongConnection = { - { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + // trying to instance an unknown node type + nlohmann::json NoModelName = { + { "instance", "graph with missing node model information" }, { "model", - { { "instance", "Test Graph Inline" }, - { "name", "Core DataflowGraph" }, + { { "name", "Core DataflowGraph" }, { "graph", { { "factories", {} }, { "nodes", - { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, - { "model", - { { "instance", "SourceFloat" }, { "name", "Source" } } } }, - { { "id", "{1111111b-2222-3333-4444-555555555555}" }, - { "model", { { "instance", "SinkInt" }, { "name", "Sink" } } } } } }, - { "connections", { { { "out_id", "wrongId" } } } } } } } } }; - result = g.fromJson( wrongConnection ); + { { { "instance", "Unknown model" }, + { "model", { { "extra", "NotaTypeName" } } } } } } } } } } }; + result = g.fromJson( NoModelName ); REQUIRE( !result ); g.destroy(); - wrongConnection = { - { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + // trying to instance an unknown node type + nlohmann::json noInstanceIdentification = { + { "instance", "graph with missing node model information" }, { "model", - { { "instance", "Test Graph Inline" }, - { "name", "Core DataflowGraph" }, + { { "name", "Core DataflowGraph" }, { "graph", { { "factories", {} }, - { "nodes", - { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, - { "model", - { { "instance", "SourceFloat" }, { "name", "Source" } } } }, - { { "id", "{1111111b-2222-3333-4444-555555555555}" }, - { "model", { { "instance", "SinkInt" }, { "name", "Sink" } } } } } }, - { "connections", - { { { "out_id", "{1111111a-2222-3333-4444-555555555555}" }, - { "out_index", 2 } } } } } } } } }; - result = g.fromJson( wrongConnection ); + { "nodes", { { { "model", { { "name", "Source" } } } } } } } } } } }; + result = g.fromJson( noInstanceIdentification ); REQUIRE( !result ); g.destroy(); - wrongConnection = { - { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + // errors in the connection description + nlohmann::json reusingNodeIdentification = { + { "instance", "graph with wrong connection" }, { "model", - { { "instance", "Test Graph Inline" }, - { "name", "Core DataflowGraph" }, + { { "name", "Core DataflowGraph" }, { "graph", { { "factories", {} }, { "nodes", - { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, - { "model", - { { "instance", "SourceFloat" }, { "name", "Source" } } } }, - { { "id", "{1111111b-2222-3333-4444-555555555555}" }, - { "model", { { "instance", "SinkInt" }, { "name", "Sink" } } } } } }, - { "connections", - { { { "out_id", "{1111111a-2222-3333-4444-555555555555}" }, - { "out_index", 0 }, - { "in_id", "wrongId" }, - { "in_index", 2 } } } } } } } } }; - result = g.fromJson( wrongConnection ); + { { { "instance", "Source" }, { "model", { { "name", "Source" } } } }, + { { "instance", "Source" }, { "model", { { "name", "Sink" } } } } } }, + { "connections", { { { "out_node", "wrongId" } } } } } } } } }; + result = g.fromJson( reusingNodeIdentification ); REQUIRE( !result ); g.destroy(); - - wrongConnection = { - { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + reusingNodeIdentification = { + { "instance", "graph with wrong connection" }, { "model", - { { "instance", "Test Graph Inline" }, - { "name", "Core DataflowGraph" }, + { { "name", "Core DataflowGraph" }, { "graph", { { "factories", {} }, { "nodes", - { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, - { "model", - { { "instance", "SourceFloat" }, { "name", "Source" } } } }, + { { { "id", "{1111111b-2222-3333-4444-555555555555}" }, + { "model", { { "name", "Source" } } } }, { { "id", "{1111111b-2222-3333-4444-555555555555}" }, - { "model", { { "instance", "SinkInt" }, { "name", "Sink" } } } } } }, - { "connections", - { { { "out_id", "{1111111a-2222-3333-4444-555555555555}" }, - { "out_index", 0 }, - { "in_id", "{1111111b-2222-3333-4444-555555555555}" }, - { "in_index", 2 } } } } } } } } }; - result = g.fromJson( wrongConnection ); + { "model", { { "name", "Sink" } } } } } }, + { "connections", { { { "out_node", "wrongId" } } } } } } } } }; + result = g.fromJson( reusingNodeIdentification ); REQUIRE( !result ); g.destroy(); - wrongConnection = { - { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + // errors in the connection description + nlohmann::json wrongConnection = { + { "instance", "graph with wrong connection" }, { "model", - { { "instance", "Test Graph Inline" }, - { "name", "Core DataflowGraph" }, + { { "name", "Core DataflowGraph" }, { "graph", { { "factories", {} }, { "nodes", - { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, - { "model", - { { "instance", "SourceFloat" }, { "name", "Source" } } } }, - { { "id", "{1111111b-2222-3333-4444-555555555555}" }, - { "model", { { "instance", "SinkInt" }, { "name", "Sink" } } } } } }, - { "connections", - { { { "out_id", "{1111111a-2222-3333-4444-555555555555}" }, - { "out_index", 0 }, - { "in_id", "{1111111b-2222-3333-4444-555555555555}" }, - { "in_index", 0 } } } } } } } } }; + { { { "instance", "SourceFloat" }, + { "model", { { "name", "Source" } } } }, + { { "instance", "SinkInt" }, { "model", { { "name", "Sink" } } } } } }, + { "connections", { { { "out_node", "wrongId" } } } } } } } } }; result = g.fromJson( wrongConnection ); REQUIRE( !result ); g.destroy(); + wrongConnection = { { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + { "instance", "Test Graph Inline" }, + { "model", + { { "name", "Core DataflowGraph" }, + { "graph", + { { "factories", {} }, + { "nodes", + { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, + { "instance", "SourceFloat" }, + { "model", { { "name", "Source" } } } }, + { { "id", "{1111111b-2222-3333-4444-555555555555}" }, + { "instance", "SinkInt" }, + { "model", { { "name", "Sink" } } } } } }, + { "connections", + { { { "out_id", "{1111111a-2222-3333-4444-555555555555}" }, + { "out_index", 2 } } } } } } } } }; + result = g.fromJson( wrongConnection ); + REQUIRE( !result ); + g.destroy(); + + wrongConnection = { { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + { "instance", "Test Graph Inline" }, + { "model", + { { "name", "Core DataflowGraph" }, + { "graph", + { { "factories", {} }, + { "nodes", + { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, + { "instance", "SourceFloat" }, + { "model", { { "name", "Source" } } } }, + { { "id", "{1111111b-2222-3333-4444-555555555555}" }, + { "instance", "SinkInt" }, + { "model", { { "name", "Sink" } } } } } }, + { "connections", + { { { "out_id", "{1111111a-2222-3333-4444-555555555555}" }, + { "out_index", 0 }, + { "in_node", "Sink" }, + { "in_port", "from" } } } } } } } } }; + result = g.fromJson( wrongConnection ); + REQUIRE( !result ); + g.destroy(); + + wrongConnection = { { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + { "instance", "Test Graph Inline" }, + { "model", + { { "name", "Core DataflowGraph" }, + { "graph", + { { "factories", {} }, + { "nodes", + { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, + { "instance", "SourceFloat" }, + { "model", { { "name", "Source" } } } }, + { { "id", "{1111111b-2222-3333-4444-555555555555}" }, + { "instance", "SinkInt" }, + { "model", { { "name", "Sink" } } } } } }, + { "connections", + { { { "out_id", "{1111111a-2222-3333-4444-555555555555}" }, + { "out_index", 0 }, + { "in_node", "SinkInt" }, + { "in_port", "from" } } } } } } } } }; + result = g.fromJson( wrongConnection ); + REQUIRE( !result ); + g.destroy(); + + // Constructed a correct graph nlohmann::json goodSimpleGraph = { { "id", "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}" }, + { "instance", "Test Graph Inline" }, { "model", - { { "instance", "Test Graph Inline" }, - { "name", "Core DataflowGraph" }, + { { "name", "Core DataflowGraph" }, { "graph", { { "factories", {} }, { "nodes", { { { "id", "{1111111a-2222-3333-4444-555555555555}" }, - { "model", - { { "instance", "SourceFloat" }, { "name", "Source" } } } }, - { { "id", "{1111111b-2222-3333-4444-555555555555}" }, - { "model", - { { "instance", "SinkFloat" }, { "name", "Sink" } } } } } }, + { "instance", "SourceFloat" }, + { "model", { { "name", "Source" } } } }, + { { "instance", "SinkFloat" }, + { "model", { { "name", "Sink" } } } } } }, { "connections", { { { "out_id", "{1111111a-2222-3333-4444-555555555555}" }, - { "out_index", 0 }, - { "in_id", "{1111111b-2222-3333-4444-555555555555}" }, + { "out_port", "to" }, + { "in_node", "SinkFloat" }, { "in_index", 0 } } } } } } } } }; result = g.fromJson( goodSimpleGraph ); REQUIRE( result ); @@ -346,6 +383,7 @@ TEST_CASE( "Dataflow/Core/Graph", "[Dataflow][Core][Graph]" ) { } SECTION( "Inspection of a graph" ) { + std::cout << "Loading graph data/Dataflow/ExampleGraph.json\n"; auto g = DataflowGraph::loadGraphFromJsonFile( "data/Dataflow/ExampleGraph.json" ); // Factories used by the graph diff --git a/tests/unittest/Dataflow/serialization.cpp b/tests/unittest/Dataflow/serialization.cpp index b01e2e54193..21d8e180afb 100644 --- a/tests/unittest/Dataflow/serialization.cpp +++ b/tests/unittest/Dataflow/serialization.cpp @@ -13,12 +13,12 @@ #include TEST_CASE( "Dataflow/Core/DataflowGraph", "[Dataflow][Core][DataflowGraph]" ) { - SECTION( "Serialization of a graph" ) { - + SECTION( "Execution and modification of a graph" ) { using namespace Ra::Dataflow::Core; using DataType = Scalar; DataflowGraph g { "original graph" }; - + g.addJsonMetaData( + { { "extra", { { "info", "missing operators on functional node" } } } } ); auto source_a = new Sources::SingleDataSourceNode( "a" ); g.addNode( std::unique_ptr( source_a ) ); auto a = g.getDataSetter( "a_to" ); @@ -33,9 +33,10 @@ TEST_CASE( "Dataflow/Core/DataflowGraph", "[Dataflow][Core][DataflowGraph]" ) { TestNode::Arg2_type b ) -> TestNode::Res_type { return a + b; }; - auto op = new TestNode( "addition" ); - op->setOperator( add ); - g.addNode( std::unique_ptr( op ) ); + auto op_unique = std::make_unique( "addition" ); + op_unique->setOperator( add ); + auto [added, op] = g.addNode( std::move( op_unique ) ); + REQUIRE( added ); g.addLink( source_a, "to", op, "a" ); g.addLink( op, "r", sink, "from" ); g.addLink( source_b, "to", op, "b" ); @@ -52,8 +53,6 @@ TEST_CASE( "Dataflow/Core/DataflowGraph", "[Dataflow][Core][DataflowGraph]" ) { // Save the graph std::string tmpdir { "tmpDir4Tests" }; - - std::cout << "Graph tmp dir : " << tmpdir << "\n"; std::filesystem::create_directories( tmpdir ); g.saveToJson( tmpdir + "/GraphSerializationTest.json" ); g.destroy(); diff --git a/tests/unittest/data/Dataflow/ExampleGraph.json b/tests/unittest/data/Dataflow/ExampleGraph.json index 6c9f70b6aae..96025e0cb30 100644 --- a/tests/unittest/data/Dataflow/ExampleGraph.json +++ b/tests/unittest/data/Dataflow/ExampleGraph.json @@ -1,94 +1,93 @@ { - "id": "{d3c4d86a-49d9-496e-b01b-1c142538d8ef}", + "instance": "Example graph", "model": { "graph": { "connections": [ { - "in_id": "{016829fe-65fc-4b09-aaaf-04b76813e9bd}", - "in_index": 0, - "out_id": "{d1ac47fc-a128-4dea-8542-6303acc77688}", - "out_index": 0 + "in_node": "reduced vector", + "in_port": "from", + "out_node": "Collection reducer - original collection", + "out_port": "out" }, { - "in_id": "{d1ac47fc-a128-4dea-8542-6303acc77688}", - "in_index": 0, - "out_id": "{564cd37a-5d99-45cd-a642-8743a7b10adc}", - "out_index": 0 + "in_node": "Collection reducer - original collection", + "in_port": "in", + "out_node": "Vector", + "out_port": "to" }, { - "in_id": "{d1ac47fc-a128-4dea-8542-6303acc77688}", - "in_index": 1, - "out_id": "{5bd5b929-acf2-461b-a7da-73e662d61962}", - "out_index": 0 + "in_node": "Collection reducer - original collection", + "in_port": "f", + "out_node": "Reducer", + "out_port": "f" }, { - "in_id": "{d1ac47fc-a128-4dea-8542-6303acc77688}", - "in_index": 2, - "out_id": "{7a0c688e-c785-4849-ad34-89abd1473f4c}", - "out_index": 0 + "in_node": "Collection reducer - original collection", + "in_port": "init", + "out_node": "Neutral", + "out_port": "to" }, { - "in_id": "{22dfcafb-9581-40be-b269-a17cf1e948d6}", - "in_index": 0, - "out_id": "{b9a33fe7-4ada-4a8e-a104-81341912f6ef}", - "out_index": 0 + "in_node": "Collection reducer - transformed collection", + "in_port": "in", + "out_node": "Collection transformer", + "out_port": "out" }, { - "in_id": "{22dfcafb-9581-40be-b269-a17cf1e948d6}", - "in_index": 1, - "out_id": "{5bd5b929-acf2-461b-a7da-73e662d61962}", - "out_index": 0 + "in_node": "Collection reducer - transformed collection", + "in_port": "f", + "out_node": "Reducer", + "out_port": "f" }, { - "in_id": "{b9a33fe7-4ada-4a8e-a104-81341912f6ef}", - "in_index": 0, - "out_id": "{564cd37a-5d99-45cd-a642-8743a7b10adc}", - "out_index": 0 + "in_node": "Collection transformer", + "in_port": "in", + "out_node": "Vector", + "out_port": "to" }, { - "in_id": "{b9a33fe7-4ada-4a8e-a104-81341912f6ef}", - "in_index": 1, - "out_id": "{6d442201-7e25-44f4-81cc-4dcea78780b2}", - "out_index": 0 + "in_node": "Collection transformer", + "in_port": "f", + "out_node": "Doubler", + "out_port": "f" }, { - "in_id": "{465d2861-dcbe-4717-a70d-c75e1042a730}", - "in_index": 0, - "out_id": "{22dfcafb-9581-40be-b269-a17cf1e948d6}", - "out_index": 0 + "in_node": "transformed/reduced vector", + "in_port": "from", + "out_node": "Collection reducer - transformed collection", + "out_port": "out" }, { - "in_id": "{0b74b010-2bc6-4b56-914d-ddbf30701946}", - "in_index": 0, - "out_id": "{22a6cb27-a0c9-4ac4-8adb-5c4b70beb6d4}", - "out_index": 0 + "in_node": "validation value", + "in_port": "from", + "out_node": "Validator : evaluate the validation predicate", + "out_port": "r" }, { - "in_id": "{22a6cb27-a0c9-4ac4-8adb-5c4b70beb6d4}", - "in_index": 0, - "out_id": "{d1ac47fc-a128-4dea-8542-6303acc77688}", - "out_index": 0 + "in_node": "Validator : evaluate the validation predicate", + "in_port": "a", + "out_node": "Collection reducer - original collection", + "out_port": "out" }, { - "in_id": "{22a6cb27-a0c9-4ac4-8adb-5c4b70beb6d4}", - "in_index": 1, - "out_id": "{22dfcafb-9581-40be-b269-a17cf1e948d6}", - "out_index": 0 + "in_node": "Validator : evaluate the validation predicate", + "in_port": "b", + "out_node": "Collection reducer - transformed collection", + "out_port": "out" }, { - "in_id": "{22a6cb27-a0c9-4ac4-8adb-5c4b70beb6d4}", - "in_index": 2, - "out_id": "{f920fe05-221d-4549-819a-f24dce92d9db}", - "out_index": 0 + "in_node": "Validator : evaluate the validation predicate", + "in_port": "f", + "out_node": "Validator", + "out_port": "f" } ], "factories": [], "nodes": [ { - "id": "{564cd37a-5d99-45cd-a642-8743a7b10adc}", + "instance": "Vector", "model": { "comment": "Unable to save data when serializing a SingleDataSourceNode>.", - "instance": "Vector", "name": "Source>" }, "position": { @@ -97,10 +96,9 @@ } }, { - "id": "{6d442201-7e25-44f4-81cc-4dcea78780b2}", + "instance": "Doubler", "model": { "comment": "Unable to save data when serializing a FunctionSourceNode>.", - "instance": "Doubler", "name": "Source>" }, "position": { @@ -109,9 +107,8 @@ } }, { - "id": "{7a0c688e-c785-4849-ad34-89abd1473f4c}", + "instance": "Neutral", "model": { - "instance": "Neutral", "name": "Source", "number": 0.0 }, @@ -121,10 +118,9 @@ } }, { - "id": "{5bd5b929-acf2-461b-a7da-73e662d61962}", + "instance": "Reducer", "model": { "comment": "Unable to save data when serializing a FunctionSourceNode>.", - "instance": "Reducer", "name": "Source>" }, "position": { @@ -133,9 +129,8 @@ } }, { - "id": "{016829fe-65fc-4b09-aaaf-04b76813e9bd}", + "instance": "reduced vector", "model": { - "instance": "reduced vector", "name": "Sink" }, "position": { @@ -144,10 +139,9 @@ } }, { - "id": "{d1ac47fc-a128-4dea-8542-6303acc77688}", + "instance": "Collection reducer - original collection", "model": { "comment": "Reduce operator could not be serialized for Reduce>", - "instance": "Collection reducer - original collection", "name": "Reduce>" }, "position": { @@ -156,10 +150,9 @@ } }, { - "id": "{22dfcafb-9581-40be-b269-a17cf1e948d6}", + "instance": "Collection reducer - transformed collection", "model": { "comment": "Reduce operator could not be serialized for Reduce>", - "instance": "Collection reducer - transformed collection", "name": "Reduce>" }, "position": { @@ -168,10 +161,9 @@ } }, { - "id": "{b9a33fe7-4ada-4a8e-a104-81341912f6ef}", + "instance": "Collection transformer", "model": { "comment": "Transform operator could not be serialized for Transform>", - "instance": "Collection transformer", "name": "Transform>" }, "position": { @@ -180,9 +172,8 @@ } }, { - "id": "{465d2861-dcbe-4717-a70d-c75e1042a730}", + "instance": "transformed/reduced vector", "model": { - "instance": "transformed/reduced vector", "name": "Sink" }, "position": { @@ -191,10 +182,9 @@ } }, { - "id": "{f920fe05-221d-4549-819a-f24dce92d9db}", + "instance": "Validator", "model": { "comment": "Unable to save data when serializing a FunctionSourceNode>.", - "instance": "Validator", "name": "Source>" }, "position": { @@ -203,9 +193,8 @@ } }, { - "id": "{0b74b010-2bc6-4b56-914d-ddbf30701946}", + "instance": "validation value", "model": { - "instance": "validation value", "name": "Sink" }, "position": { @@ -214,10 +203,9 @@ } }, { - "id": "{22a6cb27-a0c9-4ac4-8adb-5c4b70beb6d4}", + "instance": "Validator : evaluate the validation predicate", "model": { "comment": "Binary operator could not be serialized for BinaryOp bool>", - "instance": "Validator : evaluate the validation predicate", "name": "BinaryOp bool>" }, "position": { @@ -227,7 +215,6 @@ } ] }, - "instance": "Example graph", "name": "Core DataflowGraph" } }