private ITripChain CreatePickUpTrip(ITrip trip, ISharedMode mode, out bool success)
        {
            ITripChain auxTripChain = new AuxiliaryTripChain();

            //go to trip
            ITrip goToTrip = AuxiliaryTrip.MakeAuxiliaryTrip(trip.OriginalZone, trip.TripChain.Person.Household.HomeZone, mode.AssociatedMode, trip.ActivityStartTime);

            //End Time of return trip
            Time travelTimeToHome = mode.TravelTime(trip.OriginalZone, trip.TripChain.Person.Household.HomeZone, trip.TripStartTime);
            Time tripEndTime      = trip.ActivityStartTime + travelTimeToHome;

            //return home trip
            ITrip returnHomeTrip = AuxiliaryTrip.MakeAuxiliaryTrip(trip.TripChain.Person.Household.HomeZone, trip.OriginalZone, mode, tripEndTime);

            //travel times generated
            success = returnHomeTrip.TravelTime > Time.Zero && goToTrip.TravelTime > Time.Zero;

            auxTripChain.Trips.Add(goToTrip);
            auxTripChain.Trips.Add(returnHomeTrip);

            return(auxTripChain);
        }
        private ITripChain CreatePickUpTrip(ITrip trip, ISharedMode mode, out bool success)
        {
            ITripChain auxTripChain = new AuxiliaryTripChain();

            //go to trip
            ITrip goToTrip = AuxiliaryTrip.MakeAuxiliaryTrip( trip.OriginalZone, trip.TripChain.Person.Household.HomeZone, mode.AssociatedMode, trip.ActivityStartTime );

            //End Time of return trip
            Time travelTimeToHome = mode.TravelTime( trip.OriginalZone, trip.TripChain.Person.Household.HomeZone, trip.TripStartTime );
            Time tripEndTime = trip.ActivityStartTime + travelTimeToHome;

            //return home trip
            ITrip returnHomeTrip = AuxiliaryTrip.MakeAuxiliaryTrip( trip.TripChain.Person.Household.HomeZone, trip.OriginalZone, mode, tripEndTime );

            //travel times generated
            success = returnHomeTrip.TravelTime > Time.Zero && goToTrip.TravelTime > Time.Zero;

            auxTripChain.Trips.Add( goToTrip );
            auxTripChain.Trips.Add( returnHomeTrip );

            return auxTripChain;
        }
        /// <summary>
        /// Adds the auxiliary trip chain to the person if its Utility is greater than not including it
        /// </summary>
        /// <param name="driver">the driver</param>
        /// <param name="passenger">the passenger</param>
        /// <param name="trip1">aux trip 1</param>
        /// <param name="trip2">aux trip 2</param>
        /// <param name="facilitateTrip">the trip being facilitated</param>
        /// <param name="mode">the shared mode to assign</param>
        /// <param name="dropoff">is this a dropoff or pickup aux trip chain?</param>
        /// <param name="connectingTrip">what is the chain this aux trip chain connects to if any?</param>
        private void AddAuxTripChain(ITashaPerson driver, ITashaPerson passenger, ITrip trip1, ITrip trip2, ITrip facilitateTrip, ISharedMode mode, bool dropoff, ITrip connectingTrip)
        {
            ITripChain auxTripChain = new AuxiliaryTripChain();

            auxTripChain.Attach("SharedMode", mode);
            auxTripChain.Attach("FacilitateTrip", facilitateTrip);
            trip1.TripChain = auxTripChain;
            trip2.TripChain = auxTripChain;
            auxTripChain.Trips.Add(trip1);
            auxTripChain.Trips.Add(trip2);
            auxTripChain.Person = driver;
            facilitateTrip.Attach("isDriver", false);
            if (dropoff)
            {
                trip1.Passengers.Add(passenger);
                trip1.Attach("isDriver", true);
            }
            else
            {
                trip2.Passengers.Add(passenger);
                trip2.Attach("isDriver", true);
            }
            if (connectingTrip != null)
            {
                auxTripChain.Attach("ConnectingChain", connectingTrip);
            }
            if (dropoff)
            {
                if (connectingTrip == null)
                {
                    auxTripChain.Attach("Purpose", Activity.DropoffAndReturn);
                    trip1.Purpose = Activity.FacilitatePassenger;
                    trip2.Purpose = Activity.Home;
                }
                else if (connectingTrip != null)
                {
                    auxTripChain.Attach("Purpose", Activity.Dropoff);
                    auxTripChain.Attach("OriginalPurpose", connectingTrip.Purpose);
                    trip1.Purpose = Activity.FacilitatePassenger;
                    trip2.Purpose = connectingTrip.Purpose;

                    //transfering feasible transit stations and such
                    foreach (var key in connectingTrip.Keys)
                    {
                        trip1.Attach(key, connectingTrip[key]);
                    }
                }
            }
            else
            {
                if (connectingTrip == null)
                {
                    auxTripChain.Attach("Purpose", Activity.PickupAndReturn);
                    trip1.Purpose = Activity.FacilitatePassenger;
                    trip2.Purpose = Activity.Home;
                }
                else if (connectingTrip != null)
                {
                    ///TODO: Look into this again
                    auxTripChain.Attach("Purpose", Activity.Pickup);
                    auxTripChain.Attach("OriginalPurpose", connectingTrip.Purpose);
                    trip1.Purpose = Activity.FacilitatePassenger;
                    trip2.Purpose = Activity.Home;

                    //transfering feasible transit stations and such
                    foreach (var key in connectingTrip.Keys)
                    {
                        trip2.Attach(key, connectingTrip[key]);
                    }
                }
            }
            double oldU, newU;

            CalculateU(auxTripChain, out oldU, out newU);
            if (double.IsNegativeInfinity(oldU) | (newU > oldU))
            {
                driver.AuxTripChains.Add(auxTripChain);
                auxTripChain.Attach("FacilitateTripMode", mode);
            }
        }
        /// <summary>
        /// Adds the auxiliary trip chain to the person if its Utility is greater than not including it
        /// </summary>
        /// <param name="driver">the driver</param>
        /// <param name="passenger">the passenger</param>
        /// <param name="trip1">aux trip 1</param>
        /// <param name="trip2">aux trip 2</param>
        /// <param name="facilitateTrip">the trip being facilitated</param>
        /// <param name="mode">the shared mode to assign</param>
        /// <param name="dropoff">is this a dropoff or pickup aux trip chain?</param>
        /// <param name="connectingTrip">what is the chain this aux trip chain connects to if any?</param>
        private void AddAuxTripChain(ITashaPerson driver, ITashaPerson passenger, ITrip trip1, ITrip trip2, ITrip facilitateTrip, ISharedMode mode, bool dropoff, ITrip connectingTrip)
        {
            ITripChain auxTripChain = new AuxiliaryTripChain();
            auxTripChain.Attach( "SharedMode", mode );
            auxTripChain.Attach( "FacilitateTrip", facilitateTrip );
            trip1.TripChain = auxTripChain;
            trip2.TripChain = auxTripChain;
            auxTripChain.Trips.Add( trip1 );
            auxTripChain.Trips.Add( trip2 );
            auxTripChain.Person = driver;
            facilitateTrip.Attach( "isDriver", false );
            if ( dropoff )
            {
                trip1.Passengers.Add( passenger );
                trip1.Attach( "isDriver", true );
            }
            else
            {
                trip2.Passengers.Add( passenger );
                trip2.Attach( "isDriver", true );
            }
            if ( connectingTrip != null )
            {
                auxTripChain.Attach( "ConnectingChain", connectingTrip );
            }
            if ( dropoff )
            {
                if ( connectingTrip == null )
                {
                    auxTripChain.Attach( "Purpose", Activity.DropoffAndReturn );
                    trip1.Purpose = Activity.FacilitatePassenger;
                    trip2.Purpose = Activity.Home;
                }
                else if ( connectingTrip != null )
                {
                    auxTripChain.Attach( "Purpose", Activity.Dropoff );
                    auxTripChain.Attach( "OriginalPurpose", connectingTrip.Purpose );
                    trip1.Purpose = Activity.FacilitatePassenger;
                    trip2.Purpose = connectingTrip.Purpose;

                    //transfering feasible transit stations and such
                    foreach ( var key in connectingTrip.Keys )
                    {
                        trip1.Attach( key, connectingTrip[key] );
                    }
                }
            }
            else
            {
                if ( connectingTrip == null )
                {
                    auxTripChain.Attach( "Purpose", Activity.PickupAndReturn );
                    trip1.Purpose = Activity.FacilitatePassenger;
                    trip2.Purpose = Activity.Home;
                }
                else if ( connectingTrip != null )
                {
                    ///TODO: Look into this again
                    auxTripChain.Attach( "Purpose", Activity.Pickup );
                    auxTripChain.Attach( "OriginalPurpose", connectingTrip.Purpose );
                    trip1.Purpose = Activity.FacilitatePassenger;
                    trip2.Purpose = Activity.Home;

                    //transfering feasible transit stations and such
                    foreach ( var key in connectingTrip.Keys )
                    {
                        trip2.Attach( key, connectingTrip[key] );
                    }
                }
            }
            double oldU, newU;
            CalculateU( auxTripChain, out oldU, out newU );
            if ( double.IsNegativeInfinity( oldU ) | ( newU > oldU ) )
            {
                driver.AuxTripChains.Add( auxTripChain );
                auxTripChain.Attach( "FacilitateTripMode", mode );
            }
        }