package org.archstudio.prolog.archstudio.ops; import java.math.BigInteger; import java.util.Collections; import java.util.List; import java.util.Map; import org.archstudio.bna.logics.hints.IEncodedValue; import org.archstudio.bna.logics.hints.MasterPropertyCoder; import org.archstudio.prolog.engine.PrologUtils; import org.archstudio.prolog.engine.ProofContext; import org.archstudio.prolog.engine.UnificationEngine; import org.archstudio.prolog.op.Executable; import org.archstudio.prolog.term.ComplexTerm; import org.archstudio.prolog.term.ConstantTerm; import org.archstudio.prolog.term.Term; import org.archstudio.prolog.term.VariableTerm; import org.archstudio.sysutils.SystemUtils; import org.archstudio.xadl3.hints_3_0.Hint; import org.archstudio.xadl3.hints_3_0.HintsExtension; import org.archstudio.xadl3.hints_3_0.Hints_3_0Package; import org.archstudio.xarchadt.IXArchADT; import org.archstudio.xarchadt.XArchADTProxy; import org.eclipse.emf.ecore.EObject; public class Alpha extends ComplexTerm implements Executable { public Alpha(String name, List<? extends Term> terms) { super(name, 2, terms); } @Override public Iterable<Map<VariableTerm, Term>> execute(ProofContext proofContext, UnificationEngine unificationEngine, Term source, Map<VariableTerm, Term> variables) { Number alphaNumber = PrologUtils.evaluate(proofContext, getTerm(1), variables); if (alphaNumber instanceof BigInteger) { alphaNumber = alphaNumber.doubleValue() / 255d; } float alpha = SystemUtils.bound(0, alphaNumber.floatValue(), 1); for (Term t : PrologUtils.termOrListTerms(getTerm(0).resolve(proofContext, variables))) { EObject eObject = (EObject) ((ConstantTerm) t).getValue(); IXArchADT xarch = XArchADTProxy.getXArchADT(eObject); if (alpha < 1) { HintsExtension hintsExtension = XArchADTProxy.getExtension(xarch, eObject, Hints_3_0Package.Literals.HINTS_EXTENSION, true); Hint hint = null; for (Hint currentHint : hintsExtension.getHint()) { if (currentHint.getName().equals("alpha")) { hint = currentHint; break; } } if (hint == null) { hint = XArchADTProxy.create(xarch, Hints_3_0Package.Literals.HINT); hint.setName("alpha"); hintsExtension.getHint().add(hint); } MasterPropertyCoder mpc = new MasterPropertyCoder(); IEncodedValue ev = mpc.encode(mpc, alpha); hint.setHint(ev.getType() + ":" + ev.getData()); } else { HintsExtension hintsExtension = XArchADTProxy.getExtension(xarch, eObject, Hints_3_0Package.Literals.HINTS_EXTENSION, false); if (hintsExtension != null) { Hint hint = null; for (Hint currentHint : hintsExtension.getHint()) { if (currentHint.getName().equals("alpha")) { hint = currentHint; break; } } if (hint != null) { MasterPropertyCoder mpc = new MasterPropertyCoder(); IEncodedValue ev = mpc.encode(mpc, alpha); hint.setHint(ev.getType() + ":" + ev.getData()); } } } } return Collections.singleton(variables); } }