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)); } } }
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)); } } }