// loop through optimize members of the group public void OptimizeGroup(Memo memo, PhysicProperty required) { // solver group shall optimize all its children before it can start if (IsSolverOptimizedGroup()) { OptimizeSolverOptimizedGroupChildren(memo, required); } for (int i = 0; i < exprList_.Count; i++) { CGroupMember member = exprList_[i]; // optimize the member and it shall generate a set of member member.OptimizeMember(memo); } // mark the group explored explored_ = true; }
internal void OptimizeSolverOptimizedGroupChildren(Memo memo, PhysicProperty required) { Debug.Assert(IsSolverOptimizedGroup()); CGroupMember member = exprList_[0]; var joinblock = member.Logic() as LogicJoinBlock; // optimize all children group and newly generated groups var prevGroupCount = memo.cgroups_.Count; joinblock.children_.ForEach(x => (x as LogicMemoRef).group_.OptimizeGroup(memo, required)); while (memo.stack_.Count > prevGroupCount) { memo.stack_.Pop().OptimizeGroup(memo, required); } // calculate the lowest inclusive members foreach (var c in joinblock.children_) { (c as LogicMemoRef).group_.CalculateMinInclusiveCostMember(); } }