Dryad/LinqToDryad/DynamicManager.cs

206 lines
6.9 KiB
C#
Raw Blame History

/*
Copyright (c) Microsoft Corporation
All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License
at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF
TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions and
limitations under the License.
*/
//
// <20> Microsoft Corporation. All rights reserved.
//
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Reflection;
using System.Linq;
using System.Linq.Expressions;
using System.CodeDom;
using System.Diagnostics;
using System.Xml;
using Microsoft.Research.DryadLinq.Internal;
namespace Microsoft.Research.DryadLinq
{
internal enum DynamicManagerType
{
None,
Splitter,
PartialAggregator,
FullAggregator,
HashDistributor,
RangeDistributor,
Broadcast
}
internal class DynamicManager
{
internal static DynamicManager None = new DynamicManager(DynamicManagerType.None);
internal static DynamicManager Splitter = new DynamicManager(DynamicManagerType.Splitter);
internal static DynamicManager PartialAggregator = new DynamicManager(DynamicManagerType.PartialAggregator);
internal static DynamicManager Broadcast = new DynamicManager(DynamicManagerType.Broadcast);
private DynamicManagerType m_managerType;
internal protected List<DryadQueryNode> m_vertexNodes;
private string[] m_vertexNames;
private DynamicManager(DynamicManagerType type)
{
this.m_managerType = type;
this.m_vertexNodes = new List<DryadQueryNode>();
this.m_vertexNames = null;
this.AggregationLevels = 0;
// default aggregation has 1 level
if (type == DynamicManagerType.FullAggregator)
{
AggregationLevels = 1;
}
}
/// <summary>
/// Create a dynamic manager (a Dryad policy manager) with a list of parameter nodes.
/// </summary>
/// <param name="type">Type of dynamic manager to create.</param>
/// <param name="nodes">Nodes that the manager depends on.</param>
internal DynamicManager(DynamicManagerType type, List<DryadQueryNode> nodes)
: this(type)
{
this.m_vertexNodes.AddRange(nodes);
}
/// <summary>
/// Create a dynamic manager with a single parameter node.
/// </summary>
/// <param name="type">Type of manager to create.</param>
/// <param name="node">Node that the manager depends on.</param>
internal DynamicManager(DynamicManagerType type, DryadQueryNode node)
: this(type)
{
this.m_vertexNodes.Add(node);
}
internal DynamicManagerType ManagerType
{
get { return this.m_managerType; }
}
internal DynamicManager CreateManager(DynamicManagerType type)
{
return new DynamicManager(type, this.m_vertexNodes);
}
/// <summary>
/// The aggregation level of the dynamic manager (used for aggregations only).
/// </summary>
internal int AggregationLevels { get; set; }
internal DryadQueryNode GetVertexNode(int index)
{
return this.m_vertexNodes[index];
}
internal void InsertVertexNode(int index, DryadQueryNode node)
{
if (index == -1)
{
this.m_vertexNodes.Add(node);
}
else
{
this.m_vertexNodes.Insert(index, node);
}
}
internal virtual void CreateVertexCode()
{
if (this.m_vertexNodes.Count != 0)
{
this.m_vertexNames = new string[this.m_vertexNodes.Count];
for (int i = 0; i < this.m_vertexNames.Length; i++)
{
CodeMemberMethod vertexMethod = this.m_vertexNodes[i].QueryGen.CodeGen.AddVertexMethod(this.m_vertexNodes[i]);
this.m_vertexNames[i] = vertexMethod.Name;
}
}
}
internal virtual XmlElement CreateElem(XmlDocument queryDoc)
{
XmlElement managerElem = queryDoc.CreateElement("DynamicManager");
XmlElement elem = queryDoc.CreateElement("Type");
elem.InnerText = Convert.ToString(this.ManagerType.ToString());
managerElem.AppendChild(elem);
if (AggregationLevels != 0)
{
XmlElement agg = queryDoc.CreateElement("AggregationLevels");
agg.InnerText = AggregationLevels.ToString();
managerElem.AppendChild(agg);
}
if (this.m_vertexNames != null)
{
for (int i = 0; i < this.m_vertexNames.Length; i++)
{
string dllName = this.m_vertexNodes[i].QueryGen.CodeGen.GetDryadLinqDllName();
XmlElement entryElem = DryadQueryDoc.CreateVertexEntryElem(queryDoc, dllName, this.m_vertexNames[i]);
managerElem.AppendChild(entryElem);
}
}
return managerElem;
}
}
internal class DynamicRangeDistributor : DynamicManager
{
private double m_sampleRate;
internal DynamicRangeDistributor(DryadQueryNode node)
: base(DynamicManagerType.RangeDistributor, node)
{
//@@TODO[P2]: This sample rate used here should really be its own constant.
this.m_sampleRate = HpcLinqSampler.SAMPLE_RATE;
}
internal override void CreateVertexCode()
{
}
internal override XmlElement CreateElem(XmlDocument queryDoc)
{
XmlElement managerElem = queryDoc.CreateElement("DynamicManager");
XmlElement elem = queryDoc.CreateElement("Type");
elem.InnerText = Convert.ToString(this.ManagerType.ToString());
managerElem.AppendChild(elem);
elem = queryDoc.CreateElement("SampleRate");
elem.InnerText = Convert.ToString(this.m_sampleRate);
managerElem.AppendChild(elem);
elem = queryDoc.CreateElement("VertexId");
DryadQueryNode node = this.m_vertexNodes[0];
if (node.SuperNode != null)
{
node = node.SuperNode;
}
elem.InnerText = Convert.ToString(node.m_uniqueId);
managerElem.AppendChild(elem);
return managerElem;
}
}
}