blob: 440821287a3cae2d9af4e6be88572b1ae69426cb [file] [log] [blame]
-- @atlcompiler atl2006
module SF;
create OUT : AMW from IN: AMW, left : MOF, right : MOF;
helper def: amwModel : AMW!MatchModel = OclUndefined;
helper def: listRef : Sequence(AMW!Element) = Sequence{};
helper def: methodName : String = 'Similarity flooding';
---------------------------------------------------------------------------------------------------
---------------------- generic helpers used for auxiliar tasks-----------------------------------------------------------------------------
helper context MOF!EModelElement def : isLeftME() : Boolean =
MOF!EModelElement.allInstancesFrom('left')->exists(e | e = self);
helper context MOF!EClass def : isLeft() : Boolean =
MOF!EClass.allInstancesFrom('left')->exists(e | e = self);
helper context MOF!EModelElement def : isRight() : Boolean =
if self.oclIsTypeOf(MOF!EClass) then
MOF!EClass.allInstancesFrom('right')->exists(e | e = self)
else
if self.oclIsKindOf(MOF!EStructuralFeature) then
self.isRightsf()
else
false
endif
endif;
helper context MOF!EStructuralFeature def : isLeftsf() : Boolean =
self.eContainingClass.isLeft();
helper context MOF!EStructuralFeature def : isRightsf() : Boolean =
self.eContainingClass.isRight();
helper def : maxSim : Real = 0.0;
helper def : targetRef : AMW!Element = OclUndefined;
helper context AMW!WElementRef def : getInstance (model : String): MOF!EModelElement =
MOF!EModelElement.getInstanceById(model, self.ref);
----------------------------------------------------------------------------------------
------------------------------copied rules---------------------------------------------------
rule leftElement {
from
mmw : AMW!LeftElement
to
out : AMW!LeftElement (
name <- mmw.name,
element <- mmw.element
)
}
rule rightElement {
from
mmw : AMW!RightElement
to
out : AMW!RightElement (
name <- mmw.name,
element <- mmw.element
)
}
rule ElementRefs {
from
mmw : AMW!ElementRef
to
out : AMW!ElementRef (
name <- mmw.name,
ref <- mmw.ref,
modelRef <- mmw.modelRef
)
}
rule matchmodel {
from
mmw: AMW!MatchModel
to
model : AMW!MatchModel (
name <- mmw.name,
leftM <- mmw.leftM,
rightM <- mmw.rightM,
methods <- mmw.methods->union(Sequence{method})
),
method : AMW!Method (
name <- thisModule.methodName
)
}
rule method {
from
mmw : AMW!Method
to
method : AMW!Method (
name <- mmw.name
)
}
rule modelref {
from
mmw : AMW!ModelRef
to
out : AMW!ModelRef (
name <- mmw.name,
ref <- mmw.ref
)
}
rule Edge {
from
mmw : AMW!PropagationEdge
to
edge : AMW!PropagationEdge (
name <- mmw.name,
model <- mmw.model,
incomingLink <- mmw.incomingLink,
outgoingLink <- mmw.outgoingLink,
propagation <- mmw.propagation
)
}
--------------------------------end copied rules-------------------------------------
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
helper def: aTuple : TupleType(value : Real, count : Integer) = Tuple {value = 0, count = 0};
rule PropagationRule {
from
mmw : AMW!Equivalent
to
alink : AMW!Equivalent (
name <- mmw.name,
model <- mmw.model,
left <- mmw.left,
right <- mmw.right
)
do {
-- all the propagation of neighbors nodes
thisModule.aTuple <- AMW!PropagationEdge.allInstancesFrom('IN')->
select ( e | Set { e.incomingLink.left, e.incomingLink.right} =
Set {mmw.left, mmw.right} )->
iterate (e1; acc : TupleType(value : Real, count : Integer) = Tuple {value = 0, count = 0} |
Tuple {
value = acc.value + (e1.outgoingLink.similarity * e1.propagation),
count = acc.count + 1
}
);
if (thisModule.aTuple.count = 0 ) {
alink.similarity <- mmw.similarity;
}else {
alink.similarity <- (mmw.similarity + thisModule.aTuple.value / thisModule.aTuple.count);
}
}
}