//-- 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);
 }
예제 #3
0
		//-- 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;
		}
예제 #4
0
		//-- 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;
		}