public bool MergeConstraint(long lCnstrTypeId, float fCnstrValue, ref float?pfCnstrValueOut)
        {
            trace?.Write(TraceLevel.Debug, "CM1Group::MergeConstraint");
            bool fnResult = true;

            try
            {
                if (!CM1Constraint.IsValidTypeId(lCnstrTypeId))
                {
                    throw new ArgumentOutOfRangeException(nameof(lCnstrTypeId), "Invalid input parameter");
                }

                fnResult = m_Cnstr[lCnstrTypeId - 1].Merge(fCnstrValue, ref pfCnstrValueOut);
            }
            catch (Exception error)
            {
                trace?.Write(TraceLevel.Error, error.ToLogString());
                fnResult = false;
            }

            return(fnResult);
        }
        public bool GetConstraint(long lCnstrTypeId, ref float constraintValue)
        {
            trace?.Write(TraceLevel.Info, "CM1Group:GetConstraint");
            bool fnResult = true;

            try
            {
                // Constraints (Alert!: CNSTR_BASE = 1)
                if (!CM1Constraint.IsValidTypeId(lCnstrTypeId))
                {
                    throw new ArgumentOutOfRangeException(nameof(lCnstrTypeId), "lCnstrTypeId out of range");
                }

                constraintValue = m_Cnstr[lCnstrTypeId - 1].Value;
            }
            catch (Exception error)
            {
                trace?.Write(TraceLevel.Error, error.ToLogString());
                fnResult = false;
            }

            return(fnResult);
        }