sadly, had to move IndentString() and NestString() into the header, to allow CNTKEval to compile (we need a better place for this kind of stuff--Basics.cpp?);
removed unnecessary MPI dependency from CNTKEval, its dllmain.cpp, and BestGPU.cpp
ComputationNode constructor now initializes m_evalTimeStamp (another member that was forgotten);
ExperimentalNetworkBuilder now calls FixupInputMinibatchSize() and ResetEvalTimeStamp() like the other builders (although I don't know why it is necessary)
changed LateAttachingNode's function to taking a naked pointer since we cannot reconstruct the shared_ptr (that functionality is protected);
PastValue node is now constructed correctly (but does not run properly yet, some dimensions are not set up right yet, don't yet know how to do that)
new helper class LateAttachingNode for delay nodes;
RowSliceNode: one constructor down, using default args;
new constructor arg timeStep for DelayedValueNode
IndentString() and NestString() are now part of HasToString, as that's where they are needed;
ComputationNode is now WithTag, and tags are used to build the node-group lists;
moved TypeId() to Basics.h (not sure if it belongs here);
made SynchronousExecutionEngine::SetOutputNode() static, because we can
MakeRuntimeObject<ComputationNode<>> implemented for LearnableParameter and StandardNodes (need to test all those init options of LearnableParameter);
ComputationNode<ElemType> now derives from new class BS::ComputationNodeObject (without template parameter) that we can test for in the Evaluator for infix operations on them;
all 'new ComputationNode' were changed from 'class = "XXXNode"' to 'operation = "XXX"' to be consistent with the (inconsistent) TypeName (which really is the operation name, not the type name);
unary minus with ComputationNode now uses Negate();
Scale() between ComputationNode and scalar now creates a Constant out of that scalar;
InfixOp now takes an additional parameter, the scope, needed for looking up 'precision' from higher-up scopes;
&& and || are now short-circuited like C++;
InfixOps now has only one entry for operations involving ComputationNodes, catching invalid ones now as type errors;
ConfigValuePtr now knows how to cast to 'float' as well;
BoxOf<> constructor now takes any number of arguments, whatever C::C() takes (using forwarding);
ComputationNetwork no longer derives from BS::Object, we use a BoxOf<> instead, makes life easier;
moved BS stuff to Experimental in the VS solution (until it works);
changed three array initialization functions to static (with non-static wrappers where needed);
ComputationNode base constructor forgot to initialize m_needGradient
code implemented for all standard nodes (that only take inputs but no extra args) and for ComputationNetwork, most likely buggy and incomplete;
ConfigArray::GetRange() renamed to GetIndexRange();
ComputationNetwork::NewStandardNode() and NewNode() made static to make them accessible to BrainScript;
added some comments on how to clean up SetNbrSlicesInEachRecurrentIteration();
tried to make it compile without CUDA, but hopeless
changed ConfigRecord::GetMembers() to IConfigRecord::GetMemberIds();
IConfigRecordPtr defined in BrainScriptObjects.h so that it can be passed around without having to pull in the more heavy BrainScriptEvaluator.h
The load and copy constructors (and virtual Duplicate()) are gone; instead use LoadFromFile() and CopyTo() directly.
Shared code from Past/FutureValueNode and the non-linearities (Sigmoid etc.) were extracted into shared base classes.
The updated constructors and related functions now have consistent formatting w.r.t. spacing and indentation, to make future meachnical refactorings easier.
Every ComputationNode derivate now has a typedef Base to make it less error-prone to refer to the respective base class.
Merge branch 'fseide/refactor_nodes'
runtime object construction now passes around shared_ptr<ConfigRecord> instead of const ConfigRecord &, in order to allow for late evaluation--especially MakeRuntimeObject();
new helper base class RecurrentComputationNode