3

Hello JModelica community. I already managed to compile JModelica on CentOS, but I am still failing on Ubuntu 18.04. The compilation itself is successful, but running

from pyjmi.examples import cstr_casadi
cstr_casadi.run_demo()

fails with

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-33de447ae4ee> in <module>()
----> 1 cstr_casadi.run_demo()

/opt/JModelica.org/Python/pyjmi/examples/cstr_casadi.pyc in run_demo(with_plots)
    179 
    180     # Solve the optimal control problem
--> 181     res = op.optimize(options=opt_opts)
    182 
    183     # Extract variable profiles

/opt/JModelica.org/Python/pyjmi/casadi_interface.pyc in optimize(self, algorithm, options)
    446                              "algorithm.")
    447         return self._exec_algorithm('pyjmi.jmi_algorithm_drivers',
--> 448                                     algorithm, options)
    449 
    450     # Make solve synonymous with optimize

/opt/JModelica.org/Python/pyjmi/common/core.pyc in _exec_algorithm(self, module, algorithm, options)
    166         alg = algorithm(self, options)
    167         # solve optimization problem/initialize
--> 168         alg.solve()
    169         # get and return result
    170         return alg.get_result()

/opt/JModelica.org/Python/pyjmi/jmi_algorithm_drivers.pyc in solve(self)
    351         Solve the optimization problem using ipopt solver.
    352         """
--> 353         self.nlp.solve_and_write_result()
    354 
    355     def get_result(self):

/opt/JModelica.org/Python/pyjmi/optimization/casadi_collocation.pyc in solve_and_write_result(self)
    995         t0 = time.clock()
    996         # todo: account for preprocessing time within solve_nlp separately?
--> 997         self.times['sol'] = self.solve_nlp()
    998         self.result_file_name = self.export_result_dymola(self.result_file_name)
    999         self.times['post_processing'] = time.clock() - t0 - self.times['sol'] - self.extra_update

/opt/JModelica.org/Python/pyjmi/optimization/casadi_collocation.pyc in solve_nlp(self)
    610 
    611         # Get the result
--> 612         primal_opt = N.array(self.solver_object.output(casadi.NLP_SOLVER_X))
    613         self.primal_opt = primal_opt.reshape(-1)
    614         if self.order != "default":

/opt/JModelica.org/Python/casadi/casadi_core.pyc in <lambda>(self, name)
  30560     for _s in [Function]:
  30561         __swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))
> 30562     __getattr__ = lambda self, name: _swig_getattr(self, NlpSolver, name)
  30563     __repr__ = _swig_repr
  30564 

/opt/JModelica.org/Python/casadi/casadi_core.pyc in _swig_getattr(self, class_type, name)
     78     if method:
     79         return method(self)
---> 80     raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name))
     81 
     82 

AttributeError: 'NlpSolver' object has no attribute 'output'

I tried downgrading several packages, but the problem remains. I have the same error on Arch Linux btw.

I know Ubuntu 18.04 is not officially supported, but I am hoping someone already found a solution to this problem.

EDIT: Logs from make install and make casadi_interface:

https://pastebin.com/ADRyE7XV

https://pastebin.com/dL4SCWdb

Yannick
  • 177
  • 1
  • 10

3 Answers3

1

I am answering my own question to mark it as solved. The solution comes from @Vital (see comments of original question).

In order to get JModelica working on Ubuntu 18.04 or Arch Linux solver_object.output needs to replaced by solver_object.getOutput in all affected Python files.

Yannick
  • 177
  • 1
  • 10
0

Seems you load the wrong casadi version. Can you check the output

from casadi import __version__
print(__version__)

Edit

Maybe the issue is related to the swig version.

replace solver_object.output with solver_object.getOutput should help! e.g.

primal_opt = N.array(self.solver_object.output(casadi.NLP_SOLVER_X)) 

with

primal_opt = N.array(self.solver_object.getOutput(casadi.NLP_SOLVER_X))

Maybe the changset: https://trac.jmodelica.org/changeset/8074 is helpful for overview of the files and location.

Vital
  • 41
  • 3
  • Can you add some logs e.g. `make casadi_interface -j4 2> make-casadi-errors.txt` – Vital Mar 28 '19 at 12:23
  • I added logs from `make install` and `make casadi_interface`. – Yannick Mar 31 '19 at 13:05
  • Maybe to replace `solver_object.output` with `solver_object.getOutput` help! e.g. `primal_opt = N.array(self.solver_object.output(casadi.NLP_SOLVER_X))` with `primal_opt = N.array(self.solver_object.getOutput(casadi.NLP_SOLVER_X))` – Vital May 22 '19 at 12:00
  • Wow this actually worked! I had to substitute `solver_object.output` with `solver_object.getOutput` in several files and locations. Could you provide an official answer, so I can mark it as solved? – Yannick Jun 05 '19 at 13:42
0

I created a Linux installation script based on this contribution at Stackoverflow and the original JModelica User's Guide. This installation script is hosted at https://gitlab.com/christiankral/install_jmodelica/.

christiankral
  • 393
  • 2
  • 7