//-- Max product ---------------------------------------------------------------------- /// <summary> /// /// </summary> /// <param name="B">Incoming message from 'b'.</param> /// <param name="logCost">Constant value for 'logCost'.</param> /// <param name="result">Modified to contain the outgoing message</param> /// <returns><paramref name="result"/></returns> /// <remarks><para> /// /// </para></remarks> public static UnnormalizedDiscrete AMaxConditional(UnnormalizedDiscrete B, double logCost, UnnormalizedDiscrete result) { double max = B.GetWorkspace().Max(); double[] source = B.GetWorkspace().SourceArray; double[] target = result.GetWorkspace().SourceArray; for (int i = 0; i < target.Length; i++) { target[i] = Math.Max(max - logCost, source[i]); } return(result); }
//-- Max product ---------------------------------------------------------------------- /// <summary> /// /// </summary> /// <param name="B">Incoming message from 'b'.</param> /// <param name="logUnitCost">Constant value for 'logUnitCost'.</param> /// <param name="result">Modified to contain the outgoing message</param> /// <returns><paramref name="result"/></returns> /// <remarks><para> /// /// </para></remarks> public static UnnormalizedDiscrete AMaxConditional(UnnormalizedDiscrete B, double logUnitCost, UnnormalizedDiscrete result) { double[] source = B.GetWorkspace().SourceArray; double[] target = result.GetWorkspace().SourceArray; // forward pass target[0] = source[0]; for (int i = 1; i < target.Length; i++) { target[i] = Math.Max(source[i], target[i - 1] - logUnitCost); } // reverse pass for (int i = target.Length - 2; i >= 0; i--) { target[i] = Math.Max(target[i], target[i + 1] - logUnitCost); } return(result); }
//-- Max product ---------------------------------------------------------------------- /// <summary> /// /// </summary> /// <param name="B">Incoming message from 'b'.</param> /// <param name="logCost">Constant value for 'logCost'.</param> /// <param name="result">Modified to contain the outgoing message</param> /// <returns><paramref name="result"/></returns> /// <remarks><para> /// /// </para></remarks> public static UnnormalizedDiscrete AMaxConditional(UnnormalizedDiscrete B, double logCost, UnnormalizedDiscrete result) { double max = B.GetWorkspace().Max(); double[] source = B.GetWorkspace().SourceArray; double[] target = result.GetWorkspace().SourceArray; for (int i=0; i<target.Length; i++) target[i] = Math.Max(max - logCost, source[i]); return result; }
//-- Max product ---------------------------------------------------------------------- /// <summary> /// /// </summary> /// <param name="B">Incoming message from 'b'.</param> /// <param name="logUnitCost">Constant value for 'logUnitCost'.</param> /// <param name="maxCost">Constant value for 'maxCost'.</param> /// <param name="result">Modified to contain the outgoing message</param> /// <returns><paramref name="result"/></returns> /// <remarks><para> /// /// </para></remarks> public static UnnormalizedDiscrete AMaxConditional(UnnormalizedDiscrete B, double logUnitCost, double maxCost, UnnormalizedDiscrete result) { double[] source = B.GetWorkspace().SourceArray; double[] target = result.GetWorkspace().SourceArray; // forward pass target[0] = source[0]; double max = source[0]; for (int i=1; i<target.Length; i++) { max = Math.Max(max, source[i]); target[i] = Math.Max(source[i], target[i-1] - logUnitCost); } // reverse pass double maxLessCost = max-maxCost; target[target.Length-1] = Math.Max(target[target.Length-1],maxLessCost); for (int i=target.Length-2; i>=0; i--) { target[i] = Math.Max( Math.Max(target[i], target[i+1] - logUnitCost), maxLessCost) ; } return result; }