@@ -413,19 +413,49 @@ def mutate_del_triple(child):
413413 return new_child
414414
415415
416- def mutate_expand_node (child , pb_en_out_link ):
417- # TODO: can maybe be improved by sparqling
418- nodes = list (child .nodes )
419- node = random .choice (nodes )
416+ def _mutate_expand_node_helper (node , pb_en_out_link = config .MUTPB_EN_OUT_LINK ):
420417 var_edge = gen_random_var ()
421418 var_node = gen_random_var ()
422419 if random .random () < pb_en_out_link :
423420 new_triple = (node , var_edge , var_node )
424421 else :
425422 new_triple = (var_node , var_edge , node )
423+ return new_triple , var_node
424+
425+
426+ def mutate_expand_node (child , node = None ):
427+ # TODO: can maybe be improved by sparqling
428+ if not node :
429+ nodes = list (child .nodes )
430+ node = random .choice (nodes )
431+ new_triple , _ = _mutate_expand_node_helper (node )
426432 return child + (new_triple ,)
427433
428434
435+ def mutate_deep_narrow_path (
436+ child ,
437+ min_len = config .MUTPB_DN_MIN_LEN ,
438+ max_len = config .MUTPB_DN_MAX_LEN ,
439+ term_pb = config .MUTPB_DN_TERM_PB ,
440+ ):
441+ assert isinstance (child , GraphPattern )
442+ nodes = list (child .nodes )
443+ start_node = random .choice (nodes )
444+ # target_nodes = set(nodes) - {start_node}
445+ gp = child
446+ hop = 0
447+ while True :
448+ if hop >= min_len and random .random () < term_pb :
449+ break
450+ if hop >= max_len :
451+ break
452+ hop += 1
453+ new_triple , var_node = _mutate_expand_node_helper (start_node )
454+ gp += [new_triple ]
455+ start_node = var_node
456+ return gp
457+
458+
429459def mutate_add_edge (child ):
430460 # TODO: can maybe be improved by sparqling
431461 nodes = list (child .nodes )
@@ -647,7 +677,6 @@ def mutate(
647677 pb_ae = config .MUTPB_AE ,
648678 pb_dt = config .MUTPB_DT ,
649679 pb_en = config .MUTPB_EN ,
650- pb_en_out_link = config .MUTPB_EN_OUT_LINK ,
651680 pb_fv = config .MUTPB_FV ,
652681 pb_id = config .MUTPB_ID ,
653682 pb_iv = config .MUTPB_IV ,
@@ -678,7 +707,7 @@ def mutate(
678707 child = mutate_del_triple (child )
679708
680709 if random .random () < pb_en :
681- child = mutate_expand_node (child , pb_en_out_link )
710+ child = mutate_expand_node (child )
682711 if random .random () < pb_ae :
683712 child = mutate_add_edge (child )
684713
@@ -694,7 +723,6 @@ def mutate(
694723 else :
695724 children = [child ]
696725
697-
698726 # TODO: deep & narrow paths mutation
699727
700728 children = {
0 commit comments