public override void Emit(SourceBuilder sourceCode) { // --- move list head from current position to random position --- if (Type == RandomizeListHeadsTypes.GraphElements) { // emit declaration of variable containing random position to move list head to string variableContainingRandomPosition = "random_position_" + PatternElementName; sourceCode.AppendFormat("int {0}", variableContainingRandomPosition); // emit initialization with ramdom position string graphMemberContainingElementListCountsByType = IsNode ? "nodesByTypeCounts" : "edgesByTypeCounts"; string variableContainingTypeIDForCandidate = NamesOfEntities.TypeIdForCandidateVariable(PatternElementName); sourceCode.AppendFormat(" = random.Next(graph.{0}[{1}]);\n", graphMemberContainingElementListCountsByType, variableContainingTypeIDForCandidate); // emit declaration of variable containing element at random position string typeOfVariableContainingElementAtRandomPosition = "GRGEN_LGSP." + (IsNode ? "LGSPNode" : "LGSPEdge"); string variableContainingElementAtRandomPosition = "random_element_" + PatternElementName; sourceCode.AppendFrontFormat("{0} {1}", typeOfVariableContainingElementAtRandomPosition, variableContainingElementAtRandomPosition); // emit initialization with element list head string graphMemberContainingElementListHeadByType = IsNode ? "nodesByTypeHeads" : "edgesByTypeHeads"; sourceCode.AppendFormat(" = graph.{0}[{1}];\n", graphMemberContainingElementListHeadByType, variableContainingTypeIDForCandidate); // emit iteration to get element at random position sourceCode.AppendFrontFormat( "for(int i = 0; i < {0}; ++i) {1} = {1}.Next;\n", variableContainingRandomPosition, variableContainingElementAtRandomPosition); // iteration left, element is the one at the requested random position // move list head after element at random position, sourceCode.AppendFrontFormat("graph.MoveHeadAfter({0});\n", variableContainingElementAtRandomPosition); // effect is new random starting point for following iteration } else //Type == RandomizeListHeadsTypes.IncidentEdges { // emit "randomization only if list is not empty" string variableContainingStartingPointNode = NamesOfEntities.CandidateVariable(StartingPointNodeName); string memberOfNodeContainingListHead = IsIncoming ? "lgspInhead" : "lgspOuthead"; sourceCode.AppendFrontFormat("if({0}.{1}!=null)\n", variableContainingStartingPointNode, memberOfNodeContainingListHead); sourceCode.AppendFront("{\n"); sourceCode.Indent(); // emit declaration of variable containing random position to move list head to, initialize it to 0 string variableContainingRandomPosition = "random_position_" + PatternElementName; sourceCode.AppendFrontFormat("int {0} = 0;", variableContainingRandomPosition); // misuse variable to store length of list which is computed within the follwing iteration string memberOfEdgeContainingNextEdge = IsIncoming ? "lgspInNext" : "lgspOutNext"; sourceCode.AppendFrontFormat("for(GRGEN_LGSP.LGSPEdge edge = {0}.{1}; edge!={0}.{1}; edge=edge.{2}) ++{3};\n", variableContainingStartingPointNode, memberOfNodeContainingListHead, memberOfEdgeContainingNextEdge, variableContainingRandomPosition); // emit initialization of variable containing ramdom position // now that the necessary length of the list is known after the iteration // given in the variable itself sourceCode.AppendFrontFormat("{0} = random.Next({0});\n", variableContainingRandomPosition); // emit declaration of variable containing edge at random position string variableContainingEdgeAtRandomPosition = "random_element_" + PatternElementName; sourceCode.AppendFrontFormat("GRGEN_LGSP.LGSPEdge {0}", variableContainingEdgeAtRandomPosition); // emit initialization with edge list head sourceCode.AppendFormat(" = {0}.{1};\n", variableContainingStartingPointNode, memberOfNodeContainingListHead); // emit iteration to get edge at random position sourceCode.AppendFrontFormat( "for(int i = 0; i < {0}; ++i) {1} = {1}.{2};\n", variableContainingRandomPosition, variableContainingEdgeAtRandomPosition, memberOfEdgeContainingNextEdge); // iteration left, edge is the one at the requested random position // move list head after edge at random position, if (IsIncoming) { sourceCode.AppendFrontFormat("{0}.MoveInHeadAfter({1});\n", variableContainingStartingPointNode, variableContainingEdgeAtRandomPosition); } else { sourceCode.AppendFrontFormat("{0}.MoveOutHeadAfter({1});\n", variableContainingStartingPointNode, variableContainingEdgeAtRandomPosition); } // close list is not empty check sourceCode.Unindent(); sourceCode.AppendFront("}\n"); // effect is new random starting point for following iteration } }