@@ -413,19 +413,49 @@ def mutate_del_triple(child):
413
413
return new_child
414
414
415
415
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 ):
420
417
var_edge = gen_random_var ()
421
418
var_node = gen_random_var ()
422
419
if random .random () < pb_en_out_link :
423
420
new_triple = (node , var_edge , var_node )
424
421
else :
425
422
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 )
426
432
return child + (new_triple ,)
427
433
428
434
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
+
429
459
def mutate_add_edge (child ):
430
460
# TODO: can maybe be improved by sparqling
431
461
nodes = list (child .nodes )
@@ -647,7 +677,6 @@ def mutate(
647
677
pb_ae = config .MUTPB_AE ,
648
678
pb_dt = config .MUTPB_DT ,
649
679
pb_en = config .MUTPB_EN ,
650
- pb_en_out_link = config .MUTPB_EN_OUT_LINK ,
651
680
pb_fv = config .MUTPB_FV ,
652
681
pb_id = config .MUTPB_ID ,
653
682
pb_iv = config .MUTPB_IV ,
@@ -678,7 +707,7 @@ def mutate(
678
707
child = mutate_del_triple (child )
679
708
680
709
if random .random () < pb_en :
681
- child = mutate_expand_node (child , pb_en_out_link )
710
+ child = mutate_expand_node (child )
682
711
if random .random () < pb_ae :
683
712
child = mutate_add_edge (child )
684
713
@@ -694,7 +723,6 @@ def mutate(
694
723
else :
695
724
children = [child ]
696
725
697
-
698
726
# TODO: deep & narrow paths mutation
699
727
700
728
children = {
0 commit comments