/// <summary>
        /// Runs the initialize algorithm, which according the transfer constructs appropriate constraints.
        /// </summary>
        /// <param name="constraints">The constraints.</param>
        public void runInitializeAlgorithm(out List <Constraint> constraints)
        {
            //------initialization-constraints-----------------------------------

            // createConstraintSet transfers
            List <Transfer> transfers = ConstraintUtil.retrieveTransfers();

            // createConstraintSet constraints
            constraints = ConstraintUtil.createConstraints(transfers);
            constraints.AddRange(ConstraintUtil.createConstraints(TrainLines));
        }
        // TODO: move to the IPropagator Iface.

        /// <summary>
        /// Runs the propagation algorithm.
        /// Create discrete set for constraints, normalize and merge them, and propagate constraints' sets in matrix.
        /// </summary>
        /// <param name="originalConstraints">The original constraints.</param>
        /// <param name="constraintSetsCreator">The constraint sets creator.</param>
        /// <param name="size">The size.</param>
        /// <returns></returns>
        public static PropagationResult runPropagationAlgorithm(List <Constraint> originalConstraints, IConstraintSetsCreator constraintSetsCreator, int size)
        {
            // create working copy of constraints

            List <Constraint> constraints = GenerationAlgorithmDSAUtil.cloneConstraints(originalConstraints);

            //------createConstraintSet-potential-set-for-constraints-----------------------

            constraints = constraintSetsCreator.createConstraintSets(constraints, size);

            //------modification-constraints----------------------------------

            //LogUtil.printConstraintsToFile(constraints, "originalConstraints");

            // normalize constraints
            constraints = ConstraintUtil.normalizeConstraints(constraints);

            //LogUtil.printConstraintsToFile(constraints, "normalizedConstraints");

            // find equivalent constraints
            List <List <Constraint> > groupOfconstraints = ConstraintUtil.findEquivalentConstraints(constraints);

            // try to merge them
            constraints = ConstraintUtil.mergeEquivalentConstrains(groupOfconstraints);

            //LogUtil.printConstraintsToFile(constraints, "mergedConstraints");

            // createConstraintSet a hashtable only of all trainLines used in constraints
            List <TrainLine> trainLinesMap = GenerationAlgorithmDSAUtil.createTrainLineMap(constraints);

            // store constraints - into constraintCache
            ConstraintCache.getInstance().setCacheContent(constraints);
            // create matrix of discrete sets
            Set[,] setMatrix = GenerationAlgorithmDSAUtil.createDiscretSetMatrix(constraints, trainLinesMap);


            // createConstraintSet constraint's matrix
            //this.constraintMatrix = GenerationAlgorithmPESPUtil.createConstraintMatrix(constraints, trainLinesMap);



            //-------propagation-part-of-algorithm--------------------------------------------------------
            PropagationUtil.propagate(setMatrix, trainLinesMap);

            return(new PropagationResult(setMatrix, trainLinesMap));
        }