Exemple #1
0
    static void Main()
    {
        Debug.Assert((CRootContainer.getRoot() != null));
        // create a new datamodel
        CDataModel dataModel = CRootContainer.addDatamodel();

        Debug.Assert((dataModel != null));
        Debug.Assert((CRootContainer.getDatamodelList().size() == 1));
        // next we import a simple SBML model from a string

        // clear the message queue so that we only have error messages from the import in the queue
        CCopasiMessage.clearDeque();
        bool result = true;

        try
        {
            result = dataModel.importSBMLFromString(MODEL_STRING);
        }
        catch
        {
            System.Console.Error.WriteLine("Import of model failed miserably.");
            System.Environment.Exit(1);
        }
        // check if the import was successful
        int mostSevere = CCopasiMessage.getHighestSeverity();

        // if it was a filtered error, we convert it to an unfiltered type
        // the filtered error messages have the same value as the unfiltered, but they
        // have the 7th bit set which basically adds 128 to the value
        mostSevere = mostSevere & 127;

        // we assume that the import succeeded if the return value is true and
        // the most severe error message is not an error or an exception
        if (result != true && mostSevere < CCopasiMessage.ERROR)
        {
            System.Console.Error.WriteLine("Sorry. Model could not be imported.");
            System.Environment.Exit(1);
        }

        //
        // now we tell the model object to calculate the jacobian
        //
        CModel model = dataModel.getModel();

        Debug.Assert((model != null));

        if (model != null)
        {
            // running a task, e.g. a trajectory will automatically make sure that
            // the initial values are transferred to the current state before the calculation begins.
            // If we use low level calculation methods like the one to calculate the jacobian, we
            // have to make sure the the initial values are applied to the state
            model.applyInitialValues();
            // we need an array that stores the result
            // the size of the matrix does not really matter because
            // the calculateJacobian autoamtically resizes it to the correct
            // size
            FloatMatrix jacobian = new FloatMatrix();
            // the first parameter to the calculation function is a reference to
            // the matrix where the result is to be stored
            // the second parameter is the derivationFactor for the calculation
            // it basically represents a relative delta value for the calculation of the derivatives
            // the third parameter is a boolean indicating whether the jacobian should
            // be calculated from the reduced (true) or full (false) system
            model.getMathContainer().calculateJacobian(jacobian, 1e-12, false);
            // now we print the result
            // the jacobian stores the values in the order they are
            // given in the user order in the state template so it is not really straight
            // forward to find out which column/row corresponds to which species
            CStateTemplate stateTemplate = model.getStateTemplate();
            // and we need the user order
            SizeTVector userOrder = stateTemplate.getUserOrder();
            // from those two, we can construct an new vector that contains
            // the names of the entities in the jacobian in the order in which they appear in
            // the jacobian
            System.Collections.Generic.List <string> nameVector = new System.Collections.Generic.List <string>();
            CModelEntity entity = null;
            int          status;

            for (uint i = 0; i < userOrder.size(); ++i)
            {
                entity = stateTemplate.getEntity(userOrder.get(i));
                Debug.Assert((entity != null));
                // now we need to check if the entity is actually
                // determined by an ODE or a reaction
                status = entity.getStatus();

                if (status == CModelEntity.Status_ODE ||
                    (status == CModelEntity.Status_REACTIONS && entity.isUsed()))
                {
                    nameVector.Add(entity.getObjectName());
                }
            }

            Debug.Assert((nameVector.Count == jacobian.numRows()));
            // now we print the matrix, for this we assume that no
            // entity name is longer then 5 character which is a save bet since
            // we know the model
            System.Console.Out.NewLine = "";
            System.Console.WriteLine(System.String.Format("Jacobian Matrix:{0}", System.Environment.NewLine));
            System.Console.WriteLine(System.String.Format("size:{0}x{1}{2}", jacobian.numRows(), jacobian.numCols(), System.Environment.NewLine));
            System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));
            System.Console.Out.WriteLine(System.String.Format("{0,7}", " "));

            for (int i = 0; i < nameVector.Count; ++i)
            {
                System.Console.Out.WriteLine(System.String.Format("{0,7}", nameVector[i]));
            }

            System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));

            for (uint i = 0; i < nameVector.Count; ++i)
            {
                System.Console.Out.WriteLine(System.String.Format("{0,7}", nameVector[(int)i]));

                for (uint j = 0; j < nameVector.Count; ++j)
                {
                    System.Console.Out.WriteLine(System.String.Format("{0,7:0.###}", jacobian.get(i, j)));
                }

                System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));
            }

            // we can also calculate the jacobian of the reduced system
            // in a similar way
            model.getMathContainer().calculateJacobian(jacobian, 1e-12, true);
            // this time generating the output is actually simpler because the rows
            // and columns are ordered in the same way as the independent variables of the state temple
            System.Console.WriteLine(System.String.Format("{0}{0}", System.Environment.NewLine));
            System.Console.WriteLine(System.String.Format("Reduced Jacobian Matrix:{0}{0}", System.Environment.NewLine));
            System.Console.Out.WriteLine(System.String.Format("{0:6}", " "));

            uint iMax = stateTemplate.getNumIndependent();

            for (uint i = 0; i < iMax; ++i)
            {
                System.Console.Out.WriteLine(System.String.Format("\t{0:7}", stateTemplate.getIndependent(i).getObjectName()));
            }

            System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));

            for (uint i = 0; i < iMax; ++i)
            {
                System.Console.Out.WriteLine(System.String.Format("{0:7}", stateTemplate.getIndependent(i).getObjectName()));

                for (uint j = 0; j < iMax; ++j)
                {
                    System.Console.Out.WriteLine(System.String.Format("{0,7:0.###}", jacobian.get(i, j)));
                }

                System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));
            }
        }
    }
Exemple #2
0
    static void Main()
    {
        Debug.Assert((CCopasiRootContainer.getRoot() != null));
        // create a new datamodel
        CCopasiDataModel dataModel = CCopasiRootContainer.addDatamodel();
        Debug.Assert((dataModel != null));
        Debug.Assert((CCopasiRootContainer.getDatamodelList().size() == 1));
        // next we import a simple SBML model from a string

        // clear the message queue so that we only have error messages from the import in the queue
        CCopasiMessage.clearDeque();
        bool result=true;
        try
        {
          result = dataModel.importSBMLFromString(MODEL_STRING);
        }
        catch
        {
        System.Console.Error.WriteLine("Import of model failed miserably.");
        System.Environment.Exit(1);
        }
        // check if the import was successful
        int mostSevere = CCopasiMessage.getHighestSeverity();
        // if it was a filtered error, we convert it to an unfiltered type
        // the filtered error messages have the same value as the unfiltered, but they
        // have the 7th bit set which basically adds 128 to the value
        mostSevere = mostSevere & 127;

        // we assume that the import succeeded if the return value is true and
        // the most severe error message is not an error or an exception
        if (result != true &&  mostSevere < CCopasiMessage.ERROR)
        {
        System.Console.Error.WriteLine("Sorry. Model could not be imported.");
        System.Environment.Exit(1);
        }

        //
        // now we tell the model object to calculate the jacobian
        //
        CModel model = dataModel.getModel();
        Debug.Assert((model != null));

        if (model != null)
        {
        // running a task, e.g. a trajectory will automatically make sure that
        // the initial values are transferred to the current state before the calculation begins.
        // If we use low level calculation methods like the one to calculate the jacobian, we
        // have to make sure the the initial values are applied to the state
        model.applyInitialValues();
        // we need an array that stores the result
        // the size of the matrix does not really matter because
        // the calculateJacobian autoamtically resizes it to the correct
        // size
        FloatMatrix jacobian=new FloatMatrix();
        // the first parameter to the calculation function is a reference to
        // the matrix where the result is to be stored
        // the second parameter is the derivationFactor for the calculation
        // it basically represents a relative delta value for the calculation of the derivatives
        // the third parameter is a boolean indicating whether the jacobian should
        // be calculated from the reduced (true) or full (false) system
        model.getMathContainer().calculateJacobian(jacobian, 1e-12, false);
        // now we print the result
        // the jacobian stores the values in the order they are
        // given in the user order in the state template so it is not really straight
        // forward to find out which column/row corresponds to which species
        CStateTemplate stateTemplate = model.getStateTemplate();
        // and we need the user order
        SizeTVector userOrder = stateTemplate.getUserOrder();
        // from those two, we can construct an new vector that contains
        // the names of the entities in the jacobian in the order in which they appear in
        // the jacobian
        System.Collections.Generic.List<string> nameVector=new System.Collections.Generic.List<string>();
        CModelEntity entity = null;
        int status;

        for (uint i = 0; i < userOrder.size(); ++i)
        {
            entity = stateTemplate.getEntity(userOrder.get(i));
            Debug.Assert((entity != null));
            // now we need to check if the entity is actually
            // determined by an ODE or a reaction
            status = entity.getStatus();

            if (status == CModelEntity.ODE ||
                    (status == CModelEntity.REACTIONS && entity.isUsed()))
            {
                nameVector.Add(entity.getObjectName());
            }
        }

        Debug.Assert((nameVector.Count == jacobian.numRows()));
        // now we print the matrix, for this we assume that no
        // entity name is longer then 5 character which is a save bet since
        // we know the model
        System.Console.Out.NewLine = "";
        System.Console.WriteLine(System.String.Format("Jacobian Matrix:{0}",System.Environment.NewLine));
        System.Console.WriteLine(System.String.Format("size:{0}x{1}{2}", jacobian.numRows(), jacobian.numCols(), System.Environment.NewLine));
        System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));
        System.Console.Out.WriteLine(System.String.Format("{0,7}"," "));

        for (int i = 0; i < nameVector.Count; ++i)
        {
            System.Console.Out.WriteLine(System.String.Format("{0,7}",nameVector[i]));
        }

        System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));

        for (uint i = 0; i < nameVector.Count; ++i)
        {
            System.Console.Out.WriteLine(System.String.Format("{0,7}",nameVector[(int)i]));

            for (uint j = 0; j < nameVector.Count; ++j)
            {
                System.Console.Out.WriteLine(System.String.Format("{0,7:0.###}",jacobian.get(i,j)));
            }

            System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));
        }

        // we can also calculate the jacobian of the reduced system
        // in a similar way
        model.getMathContainer().calculateJacobian(jacobian, 1e-12, true);
        // this time generating the output is actually simpler because the rows
        // and columns are ordered in the same way as the independent variables of the state temple
        System.Console.WriteLine(System.String.Format("{0}{0}",System.Environment.NewLine));
        System.Console.WriteLine(System.String.Format("Reduced Jacobian Matrix:{0}{0}", System.Environment.NewLine));
        System.Console.Out.WriteLine(System.String.Format("{0:6}"," "));

        uint iMax = stateTemplate.getNumIndependent();

        for (uint i=0;i<iMax;++i)
        {
          System.Console.Out.WriteLine(System.String.Format("\t{0:7}",stateTemplate.getIndependent(i).getObjectName()));
        }

        System.Console.WriteLine(System.String.Format("{0}",System.Environment.NewLine));

        for (uint i = 0; i < iMax; ++i)
        {
            System.Console.Out.WriteLine(System.String.Format("{0:7}",stateTemplate.getIndependent(i).getObjectName()));

            for (uint j = 0; j < iMax; ++j)
            {
                System.Console.Out.WriteLine(System.String.Format("{0,7:0.###}",jacobian.get(i,j)));
            }

            System.Console.WriteLine(System.String.Format("{0}", System.Environment.NewLine));
        }

        }
    }