Esempio n. 1
0
    def test_XML(self):
        self.message("JModelica XML parsing")
        ocp = SymbolicOCP()
        ocp.parseFMI('data/cstr.xml')

        self.assertEqual(ocp.t0, 0)
        self.assertEqual(ocp.tf, 150)
        #self.assertFalse(ocp.t0_free)
        #self.assertFalse(ocp.tf_free)
        self.assertTrue(ocp.lterm.size() == 0)
        self.assertTrue(ocp.mterm.size() == 1)
        m = ocp.mterm
        self.assertTrue(isinstance(m, SXMatrix))
        self.assertTrue(isinstance(ocp.t, SXMatrix))
        self.assertEquals(str(m), 'cost.atTime(150)')
        print dir(ocp)
        self.assertEquals(ocp.ode.size(), 3)
        self.assertEquals(len(ocp.x), 3)  # there are three states
        c = ocp.variable("cstr.c")
        T = ocp.variable("cstr.T")
        cost = ocp.variable("cost")
        self.assertTrue(isinstance(c, Variable))

        self.assertEquals(c.getName(), "cstr.c")
        self.assertEquals(T.getName(), "cstr.T")
        self.assertEquals(cost.getName(), "cost")
        self.assertEquals(c.getNominal(), 1000)

        #print c.atTime(0)

        c = c.var()
        T = T.var()
        cost = cost.var()

        u = ocp.variable("u").var()
        self.assertEquals(ocp.path.size(), 3)
        #self.assertEquals(len(ocp.cfcn_lb),3)
        #self.assertEquals(len(ocp.cfcn_ub),3)
        #self.assertTrue(ocp.cfcn[0].isEqual(T))
        #self.assertTrue(ocp.cfcn[1].isEqual(u))
        #self.assertTrue(ocp.cfcn[2].isEqual(u))
        #self.assertTrue(ocp.cfcn_lb[0].isMinusInf())
        #self.assertEquals(ocp.cfcn_lb[1].getValue(),230)
        #self.assertTrue(ocp.cfcn_lb[2].isMinusInf())
        #self.assertEquals(ocp.cfcn_ub[0].getValue(),350)
        #self.assertTrue(ocp.cfcn_ub[1].isInf())
        #self.assertEquals(ocp.cfcn_ub[2].getValue(),370)
        print ocp.initial
        print c, T, cost
        #print c.atTime(0)
        f = SXFunction([vertcat([c, T, cost])], [ocp.initial])
        f.init()
        return
        f.evaluate()
        self.checkarray(f.output(),
                        matrix([-956.271065, -250.051971, 0]).T, "initeq")

        mystates = []
Esempio n. 2
0
File: ocp.py Progetto: kozatt/casadi
  def test_XML(self):
    self.message("JModelica XML parsing")
    ocp = SymbolicOCP()
    ocp.parseFMI('data/cstr.xml')
    
    self.assertEqual(ocp.t0,0)
    self.assertEqual(ocp.tf,150)
    #self.assertFalse(ocp.t0_free)
    #self.assertFalse(ocp.tf_free)
    self.assertTrue(ocp.lterm.size()==0)
    self.assertTrue(ocp.mterm.size()==1)
    m = ocp.mterm
    self.assertTrue(isinstance(m,SXMatrix))
    self.assertTrue(isinstance(ocp.t,SXMatrix))
    self.assertEquals(str(m),'cost.atTime(150)')
    print dir(ocp)
    self.assertEquals(ocp.ode.size(),3)
    self.assertEquals(len(ocp.x),3) # there are three states
    c = ocp.variable("cstr.c")
    T = ocp.variable("cstr.T")
    cost = ocp.variable("cost")
    self.assertTrue(isinstance(c,Variable))
    
    self.assertEquals(c.getName(),"cstr.c")
    self.assertEquals(T.getName(),"cstr.T")
    self.assertEquals(cost.getName(),"cost")
    self.assertEquals(c.getNominal(),1000)
       
    #print c.atTime(0)
       
    c = c.var()
    T = T.var()
    cost = cost.var()
    
    u = ocp.variable("u").var()
    self.assertEquals(ocp.path.size(),3)
    #self.assertEquals(len(ocp.cfcn_lb),3)
    #self.assertEquals(len(ocp.cfcn_ub),3)
    #self.assertTrue(ocp.cfcn[0].isEqual(T)) 
    #self.assertTrue(ocp.cfcn[1].isEqual(u)) 
    #self.assertTrue(ocp.cfcn[2].isEqual(u)) 
    #self.assertTrue(ocp.cfcn_lb[0].isMinusInf()) 
    #self.assertEquals(ocp.cfcn_lb[1].getValue(),230) 
    #self.assertTrue(ocp.cfcn_lb[2].isMinusInf()) 
    #self.assertEquals(ocp.cfcn_ub[0].getValue(),350) 
    #self.assertTrue(ocp.cfcn_ub[1].isInf())
    #self.assertEquals(ocp.cfcn_ub[2].getValue(),370) 
    print ocp.initial
    print c,T,cost
    #print c.atTime(0)
    f=SXFunction([vertcat([c,T,cost])],[ocp.initial])
    f.init()
    return 
    f.evaluate()
    self.checkarray(f.output(),matrix([-956.271065,-250.051971,0]).T,"initeq")

    
    mystates = []
Esempio n. 3
0
 def _load_xml_to_casadi(self, xml, verbose):
     # Create a symbolic OCP
     self.ocp = casadi.SymbolicOCP()
     options = {}
     options["verbose"] = verbose
     options["sort_equations"] = False
     options["eliminate_dependent"] = False
     self.ocp.parseFMI(xml, options)
     if self._casadi_blt:
         self.ocp.makeExplicit()
         self.ocp.eliminateAlgebraic()
         if len(self.ocp.z) > 0 or self.ocp.ode.empty():
             raise RuntimeError("Unable to reformulate as ODE.")
     casadi.updateDependent(self.ocp)
     
     # Store list of non-free parameters
     self._parameters = ([pi for pi in self.ocp.pi] +
                         [pd for pd in self.ocp.pd])
     
     # Check the absence of multiple Mayer and Lagrange terms
     if self.ocp.lterm.numel() > 1:
         raise NotImplementedError("Multiple Lagrange terms are not " +
                                   "supported.")
     if self.ocp.mterm.numel() > 1:
         raise NotImplementedError("Multiple Mayer terms are not " +
                                   "supported.")
     
     # Identify variables
     variables = {}
     variables['x'] = self.ocp.x
     variables['u'] = self.ocp.u
     variables['w'] = self.ocp.z
     variables['p_opt'] = self.ocp.pf
     names = {}
     for vt in variables:
         names[vt] = [(var.getValueReference(), var.getName()) for
                      var in variables[vt]]
     
     # Make sure the variables appear in value reference order
     var_vectors = {}
     for var_type in names:
         var_dict = dict((repr(v), v) for v in variables[var_type])
         name_dict = dict((x[0], x[1]) for x in names[var_type])
         if var_type == 'p_opt':
             free_times = 0
             if self.xmldoc.get_opt_finaltime_free():
                 free_times += 1
             if self.xmldoc.get_opt_starttime_free():
                 free_times += 1
             var_vectors[var_type] = casadi.VariableVector(len(var_dict) -
                                                           free_times)
         else:
             var_vectors[var_type] = casadi.VariableVector(len(var_dict))
         i = 0
         for vr in sorted(name_dict):
             if (self.xmldoc.get_opt_finaltime_free() or
                 self.xmldoc.get_opt_starttime_free()):
                 if (name_dict[vr] == "finalTime" or
                     name_dict[vr] == "startTime"):
                     continue
             var_vectors[var_type][i] = var_dict[name_dict[vr]]
             i = i + 1
     self._var_vectors = var_vectors
     
     # Create symbolic variables
     self.dx = casadi.vertcat(casadi.der(var_vectors['x']))
     self.x = casadi.vertcat(casadi.var(var_vectors['x']))
     self.u = casadi.vertcat(casadi.var(var_vectors['u']))
     self.w = casadi.vertcat(casadi.var(var_vectors['w']))
     self.t = self.ocp.t
     self.p = casadi.vertcat(casadi.var(var_vectors['p_opt']))
     sym_vars = {'dx': self.dx,
                 'x': self.x,
                 'u': self.u,
                 'w': self.w,
                 'p_opt': self.p}
     
     # Create maps from value reference to CasADi variable index and type
     vr_map = {}
     get_vr = self.xmldoc.get_value_reference
     for vt in sym_vars.keys():
         i = 0
         for v in sym_vars[vt]:
             var_name = str(v)
             if vt == "dx":
                 var_name = convert_casadi_der_name(var_name)
             vr_map[get_vr(var_name)] = (i, vt)
             i = i + 1
     self.vr_map = vr_map
     
     # Read integer parameter values separately (circumvent SymbolicOCP bug)
     integer_vars = self.xmldoc.get_all_integer_variables()
     if len(integer_vars) > 0:
         [int_vr, int_names] = \
                 zip(*[(var.get_value_reference(), var.get_name()) for
                       var in integer_vars])
         for (vr, start) in self.xmldoc.get_variable_start_attributes():
             try:
                 index = int_vr.index(vr)
             except ValueError:
                 pass
             else:
                 var = self.ocp.variable(int_names[index])
                 # Assume that independent parameters have start values
                 if start is not None:
                     var.setStart(start)
     casadi.updateDependent(self.ocp) # Handle dependent parameters
     
     # Count variables
     self.n_x = self.x.numel()
     self.n_u = self.u.numel()
     self.n_w = self.w.numel()
     self.n_p = self.p.numel()
     
     # Create scaling factors
     sf = {}
     sf['dx'] = N.ones(self.n_x)
     sf['x'] = N.ones(self.n_x)
     sf['u'] = N.ones(self.n_u)
     sf['w'] = N.ones(self.n_w)
     sf['p_opt'] = N.ones(self.n_p)
     self.sf = sf
     self._update_sf()