Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Common / Utils / Boolean / ConversionContext.cs / 1 / ConversionContext.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace System.Data.Common.Utils.Boolean
{
///
/// Manages state used to translate BoolExpr to decision diagram vertices and back again.
/// Specializations exist for generic and DomainConstraint expressions.
///
internal abstract class ConversionContext
{
///
/// Gets the solver instance associated with this conversion context. Used to reterieve
/// canonical Decision Diagram vertices for this context.
///
internal readonly Solver Solver = new Solver();
///
/// Given a term in BoolExpr, returns the corresponding decision diagram vertex.
///
internal abstract Vertex TranslateTermToVertex(TermExpr term);
///
/// Describes a vertex as a series of literal->vertex successors such that the literal
/// logically implies the given vertex successor.
///
internal abstract IEnumerable> GetSuccessors(Vertex vertex);
}
///
/// VertexLiteral pair, used for ConversionContext.GetSuccessors
///
internal sealed class LiteralVertexPair
{
internal readonly Vertex Vertex;
internal readonly Literal Literal;
internal LiteralVertexPair(Vertex vertex, Literal literal)
{
this.Vertex = vertex;
this.Literal = literal;
}
}
///
/// Generic implementation of a ConversionContext
///
internal sealed class GenericConversionContext : ConversionContext
{
readonly Dictionary, int> _variableMap = new Dictionary, int>();
Dictionary> _inverseVariableMap;
internal override Vertex TranslateTermToVertex(TermExpr term)
{
int variable;
if (!_variableMap.TryGetValue(term, out variable))
{
variable = Solver.CreateVariable();
_variableMap.Add(term, variable);
}
return Solver.CreateLeafVertex(variable, Solver.BooleanVariableChildren);
}
internal override IEnumerable> GetSuccessors(Vertex vertex)
{
LiteralVertexPair[] successors = new LiteralVertexPair[2];
Debug.Assert(2 == vertex.Children.Length);
Vertex then = vertex.Children[0];
Vertex @else = vertex.Children[1];
// get corresponding term expression
InitializeInverseVariableMap();
TermExpr term = _inverseVariableMap[vertex.Variable];
// add positive successor (then)
Literal literal = new Literal(term, true);
successors[0] = new LiteralVertexPair(then, literal);
// add negative successor (else)
literal = literal.MakeNegated();
successors[1] = new LiteralVertexPair(@else, literal);
return successors;
}
private void InitializeInverseVariableMap()
{
if (null == _inverseVariableMap)
{
_inverseVariableMap = _variableMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
}
}
}
///
/// Specialization of ConversionContext for DomainConstraint BoolExpr
///
internal sealed class DomainConstraintConversionContext : ConversionContext>
{
///
/// A map from domain variables to decision diagram variables.
///
readonly Dictionary, int> _domainVariableToRobddVariableMap =
new Dictionary, int>();
Dictionary> _inverseMap;
///
/// Translates a domain constraint term to an N-ary DD vertex.
///
internal override Vertex TranslateTermToVertex(TermExpr> term)
{
var range = term.Identifier.Range;
var domainVariable = term.Identifier.Variable;
var domain = domainVariable.Domain;
if (range.All(element => !domain.Contains(element)))
{
// trivially false
return Vertex.Zero;
}
if (domain.All(element => range.Contains(element)))
{
// trivially true
return Vertex.One;
}
// determine assignments for this constraints (if the range contains a value in the domain, '1', else '0')
Vertex[] children = domain.Select(element => range.Contains(element) ? Vertex.One : Vertex.Zero).ToArray();
// see if we know this variable
int robddVariable;
if (!_domainVariableToRobddVariableMap.TryGetValue(domainVariable, out robddVariable))
{
robddVariable = Solver.CreateVariable();
_domainVariableToRobddVariableMap[domainVariable] = robddVariable;
}
// create a new vertex with the given assignments
return Solver.CreateLeafVertex(robddVariable, children);
}
internal override IEnumerable>> GetSuccessors(Vertex vertex)
{
InitializeInverseMap();
var domainVariable = _inverseMap[vertex.Variable];
// since vertex children are ordinally aligned with domain, handle domain as array
var domain = domainVariable.Domain.ToArray();
// foreach unique successor vertex, build up range
Dictionary> vertexToRange = new Dictionary>();
for (int i = 0; i < vertex.Children.Length; i++)
{
Vertex successorVertex = vertex.Children[i];
Set range;
if (!vertexToRange.TryGetValue(successorVertex, out range))
{
range = new Set(domainVariable.Domain.Comparer);
vertexToRange.Add(successorVertex, range);
}
range.Add(domain[i]);
}
foreach (var vertexRange in vertexToRange)
{
var successorVertex = vertexRange.Key;
var range = vertexRange.Value;
// construct a DomainConstraint including the given range
var constraint = new DomainConstraint(domainVariable, range.MakeReadOnly());
var literal = new Literal>(
new TermExpr>(constraint), true);
yield return new LiteralVertexPair>(successorVertex, literal);
}
}
private void InitializeInverseMap()
{
if (null == _inverseMap)
{
_inverseMap = _domainVariableToRobddVariableMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace System.Data.Common.Utils.Boolean
{
///
/// Manages state used to translate BoolExpr to decision diagram vertices and back again.
/// Specializations exist for generic and DomainConstraint expressions.
///
internal abstract class ConversionContext
{
///
/// Gets the solver instance associated with this conversion context. Used to reterieve
/// canonical Decision Diagram vertices for this context.
///
internal readonly Solver Solver = new Solver();
///
/// Given a term in BoolExpr, returns the corresponding decision diagram vertex.
///
internal abstract Vertex TranslateTermToVertex(TermExpr term);
///
/// Describes a vertex as a series of literal->vertex successors such that the literal
/// logically implies the given vertex successor.
///
internal abstract IEnumerable> GetSuccessors(Vertex vertex);
}
///
/// VertexLiteral pair, used for ConversionContext.GetSuccessors
///
internal sealed class LiteralVertexPair
{
internal readonly Vertex Vertex;
internal readonly Literal Literal;
internal LiteralVertexPair(Vertex vertex, Literal literal)
{
this.Vertex = vertex;
this.Literal = literal;
}
}
///
/// Generic implementation of a ConversionContext
///
internal sealed class GenericConversionContext : ConversionContext
{
readonly Dictionary, int> _variableMap = new Dictionary, int>();
Dictionary> _inverseVariableMap;
internal override Vertex TranslateTermToVertex(TermExpr term)
{
int variable;
if (!_variableMap.TryGetValue(term, out variable))
{
variable = Solver.CreateVariable();
_variableMap.Add(term, variable);
}
return Solver.CreateLeafVertex(variable, Solver.BooleanVariableChildren);
}
internal override IEnumerable> GetSuccessors(Vertex vertex)
{
LiteralVertexPair[] successors = new LiteralVertexPair[2];
Debug.Assert(2 == vertex.Children.Length);
Vertex then = vertex.Children[0];
Vertex @else = vertex.Children[1];
// get corresponding term expression
InitializeInverseVariableMap();
TermExpr term = _inverseVariableMap[vertex.Variable];
// add positive successor (then)
Literal literal = new Literal(term, true);
successors[0] = new LiteralVertexPair(then, literal);
// add negative successor (else)
literal = literal.MakeNegated();
successors[1] = new LiteralVertexPair(@else, literal);
return successors;
}
private void InitializeInverseVariableMap()
{
if (null == _inverseVariableMap)
{
_inverseVariableMap = _variableMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
}
}
}
///
/// Specialization of ConversionContext for DomainConstraint BoolExpr
///
internal sealed class DomainConstraintConversionContext : ConversionContext>
{
///
/// A map from domain variables to decision diagram variables.
///
readonly Dictionary, int> _domainVariableToRobddVariableMap =
new Dictionary, int>();
Dictionary> _inverseMap;
///
/// Translates a domain constraint term to an N-ary DD vertex.
///
internal override Vertex TranslateTermToVertex(TermExpr> term)
{
var range = term.Identifier.Range;
var domainVariable = term.Identifier.Variable;
var domain = domainVariable.Domain;
if (range.All(element => !domain.Contains(element)))
{
// trivially false
return Vertex.Zero;
}
if (domain.All(element => range.Contains(element)))
{
// trivially true
return Vertex.One;
}
// determine assignments for this constraints (if the range contains a value in the domain, '1', else '0')
Vertex[] children = domain.Select(element => range.Contains(element) ? Vertex.One : Vertex.Zero).ToArray();
// see if we know this variable
int robddVariable;
if (!_domainVariableToRobddVariableMap.TryGetValue(domainVariable, out robddVariable))
{
robddVariable = Solver.CreateVariable();
_domainVariableToRobddVariableMap[domainVariable] = robddVariable;
}
// create a new vertex with the given assignments
return Solver.CreateLeafVertex(robddVariable, children);
}
internal override IEnumerable>> GetSuccessors(Vertex vertex)
{
InitializeInverseMap();
var domainVariable = _inverseMap[vertex.Variable];
// since vertex children are ordinally aligned with domain, handle domain as array
var domain = domainVariable.Domain.ToArray();
// foreach unique successor vertex, build up range
Dictionary> vertexToRange = new Dictionary>();
for (int i = 0; i < vertex.Children.Length; i++)
{
Vertex successorVertex = vertex.Children[i];
Set range;
if (!vertexToRange.TryGetValue(successorVertex, out range))
{
range = new Set(domainVariable.Domain.Comparer);
vertexToRange.Add(successorVertex, range);
}
range.Add(domain[i]);
}
foreach (var vertexRange in vertexToRange)
{
var successorVertex = vertexRange.Key;
var range = vertexRange.Value;
// construct a DomainConstraint including the given range
var constraint = new DomainConstraint(domainVariable, range.MakeReadOnly());
var literal = new Literal>(
new TermExpr>(constraint), true);
yield return new LiteralVertexPair>(successorVertex, literal);
}
}
private void InitializeInverseMap()
{
if (null == _inverseMap)
{
_inverseMap = _domainVariableToRobddVariableMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- HttpHandlersSection.cs
- CodeLabeledStatement.cs
- ComPlusServiceLoader.cs
- TcpPortSharing.cs
- HttpCapabilitiesEvaluator.cs
- Quack.cs
- DateBoldEvent.cs
- SecurityUtils.cs
- Msec.cs
- DataSourceComponent.cs
- EncoderExceptionFallback.cs
- TableItemStyle.cs
- WS2007HttpBinding.cs
- CharacterMetrics.cs
- TextLineResult.cs
- ButtonAutomationPeer.cs
- XmlElementAttribute.cs
- XsltQilFactory.cs
- Adorner.cs
- SQlBooleanStorage.cs
- AutomationPropertyInfo.cs
- DesignerOptionService.cs
- validationstate.cs
- ButtonAutomationPeer.cs
- ObjectPersistData.cs
- DefaultShape.cs
- FilteredDataSetHelper.cs
- ByteConverter.cs
- XsltCompileContext.cs
- PartialCachingControl.cs
- DirectoryNotFoundException.cs
- EncryptedPackage.cs
- WebEventCodes.cs
- InlineObject.cs
- DemultiplexingClientMessageFormatter.cs
- XmlWriterSettings.cs
- WorkflowQueueInfo.cs
- RepeatInfo.cs
- KeyFrames.cs
- XPathItem.cs
- AlignmentXValidation.cs
- ActivityWithResultValueSerializer.cs
- Int64Animation.cs
- InplaceBitmapMetadataWriter.cs
- ExceptionHandlerDesigner.cs
- GridViewRowPresenterBase.cs
- FatalException.cs
- BounceEase.cs
- WindowsHyperlink.cs
- BindingExpressionBase.cs
- FormViewPagerRow.cs
- SoundPlayerAction.cs
- Peer.cs
- AxisAngleRotation3D.cs
- SqlDelegatedTransaction.cs
- GridViewDeleteEventArgs.cs
- EntitySet.cs
- Int32KeyFrameCollection.cs
- dbenumerator.cs
- SplineKeyFrames.cs
- DiscoveryMessageSequenceGenerator.cs
- X509ClientCertificateAuthentication.cs
- MultipartIdentifier.cs
- DeferredTextReference.cs
- IUnknownConstantAttribute.cs
- ILGenerator.cs
- HtmlTitle.cs
- DirectionalLight.cs
- RectAnimationBase.cs
- XmlAttributeProperties.cs
- XmlSchemaSimpleContent.cs
- FormsAuthenticationConfiguration.cs
- Operator.cs
- NamespaceEmitter.cs
- FocusManager.cs
- InitializationEventAttribute.cs
- RangeValuePatternIdentifiers.cs
- sqlpipe.cs
- HtmlUtf8RawTextWriter.cs
- cookiecontainer.cs
- RemoteWebConfigurationHost.cs
- CatalogPartChrome.cs
- Hashtable.cs
- CompoundFileStreamReference.cs
- CodeDefaultValueExpression.cs
- Invariant.cs
- QueryRewriter.cs
- FillBehavior.cs
- ReadOnlyCollectionBuilder.cs
- SpecularMaterial.cs
- PointAnimationUsingKeyFrames.cs
- ProgressChangedEventArgs.cs
- ItemCollectionEditor.cs
- ErrorView.xaml.cs
- FlowDocument.cs
- baseshape.cs
- TransactionalPackage.cs
- EpmTargetPathSegment.cs
- ClientFormsIdentity.cs
- RenderOptions.cs