Page 1 of 6

Numworks+Giac

Unread postPosted: 03 Sep 2017, 09:32
by parisse
J'ai partiellement reussi a integrer giac dans l'application de calculs, sur le simulateur uniquement bien sur (pas assez de flash pour la calculatrice physique).
Voici comment:
1/ Installer Giac/Xcas sur Mac, ca doit aussi marcher sous Linux (je n'ai pas teste)
2/ Dans le Makefile principal ajouter
Code: Select all
LDFLAGS = -lgiac

Sur Mac, il est peut-etre necessaire de mettre
Code: Select all
LDFLAGS = -L/Applications/usr/lib -lgiac

3/ Modifier apps/calculation/calculation.cpp, remplacer
Code: Select all
void Calculation::setContent(const char * c, Context * context) {
...
}

par
Code: Select all
extern "C" const char * caseval(const char *);

void Calculation::setContent(const char * c, Context * context) {
  reset();
#if 0
  strlcpy(m_inputText, c, sizeof(m_inputText));
#else
  static const char * bidon=caseval("init geogebra");
  const char * ans=caseval(c);
  strlcpy(m_inputText,ans,sizeof(m_inputText));
#endif
  Evaluation<double> * evaluation = input()->evaluate<double>(*context);
  evaluation->writeTextInBuffer(m_outputText, sizeof(m_outputText));
  delete evaluation;
}


Ensuite recompiler, par exemple avec gcc-7
Code: Select all
make PLATFORM=simulator CC=gcc-7 CXX=g++-7 LD=g++-7


Lancer ./app.elf, essayez par exemple int(1/x,1,2), observez que l'input est remplace le resultat exact du calcul fait par giac (en mode geogebra). J'aurais bien voulu remplacer l'output par le resultat mais ca ne marche pas parce qu'il y a surement un post-traitement qui veut un resultat approche. Mais l'objectif est atteint de mon cote, ca marche et c'est tres facile a mettre en oeuvre.

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 09:42
by critor
Bien. :)
Et donc, on a une estimation de la taille nécessaire ?

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 11:04
by parisse
Je n'ai pas essaye de compiler la meme chose pour ARM vu que ca ne sert a rien pour le moment, mais il n'y a pas de raison que ca soit different de khicas, donc environ 5M (on peut economiser les flottants multi-precision et remplacer GMP par tommath, on ne peut pas compresser puisqu'il n'y a pas de ram pour decompresser).

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 14:20
by parisse
Bon, j'ai reussi a avoir un historique plus standard avec giac, il faut modifier un peu plus le code source mais c'est quand meme mieux!
Dans le Makefile principal, rajouter -DGIAC a CXXFLAGS, ce qui donne
Code: Select all
CXXFLAGS = -DGIAC -g -std=c++11 -fno-exceptions -fno-rtti -fno-threadsafe-statics
LDFLAGS=-lgiac

Dans apps/calculation, il faut modifier 3 fichiers:
calculation.h:
Code: Select all
class Calculation {
public:
  Calculation();
  ~Calculation(); // Delete expression and layout, if needed
  Calculation& operator=(const Calculation& other);
  Calculation(const Calculation& other) = delete;
  Calculation(Calculation&& other) = delete;
  Calculation& operator=(Calculation&& other) = delete;
  /* c.reset() is the equivalent of c = Calculation() without copy assingment. */
  void reset();
  const char * inputText();
  const char * outputText();
  Poincare::Expression * input();
  Poincare::ExpressionLayout * inputLayout();
#ifdef GIAC
  Poincare::Expression * output(Poincare::Context * context);
#else
  Poincare::Evaluation<double> * output(Poincare::Context * context);
#endif
  Poincare::ExpressionLayout * outputLayout(Poincare::Context * context);
  void setContent(const char * c, Poincare::Context * context);
  bool isEmpty();
  void tidy();
private:
  char m_inputText[::TextField::maxBufferSize()];
  char m_outputText[2*::TextField::maxBufferSize()];
  Poincare::Expression * m_input;
  Poincare::ExpressionLayout * m_inputLayout;
#ifdef GIAC
  Poincare::Expression * m_output;
#else
  Poincare::Evaluation<double> * m_output;
#endif
  Poincare::ExpressionLayout * m_outputLayout;
};

calculation.cpp, 2 fonctions a modifier
Code: Select all
void Calculation::setContent(const char * c, Context * context) {
  reset();
#ifdef GIAC
  strlcpy(m_inputText, c, sizeof(m_inputText));
  static const char * bidon=caseval("init geogebra");
  const char * ans=caseval(c);
  strlcpy(m_outputText,ans,sizeof(m_outputText));
#else
  strlcpy(m_inputText, c, sizeof(m_inputText));
  Evaluation<double> * evaluation = input()->evaluate<double>(*context);
  evaluation->writeTextInBuffer(m_outputText, sizeof(m_outputText));
  delete evaluation;
#endif
}
...
#ifdef GIAC
Expression * Calculation::output(Context * context) {
  if (m_output == nullptr) {
    m_output = Expression::parse(m_outputText);
  }
  return m_output;
}

#else 
Evaluation<double> * Calculation::output(Context * context) {
  if (m_output == nullptr) {
    /* To ensure that the expression 'm_output' is a matrix or a complex, we
     * call 'evaluate'. */
    Expression * exp = Expression::parse(m_outputText);
    if (exp != nullptr) {
      m_output = exp->evaluate<double>(*context);
      delete exp;
    } else {
      m_output = new Complex<double>(Complex<double>::Float(NAN));
    }
  }
  return m_output;
}
#endif

enfin dans local_context.cpp, 1 fonction a modifier:
Code: Select all
Evaluation<double> * LocalContext::ansValue() {
  if (m_calculationStore->numberOfCalculations() == 0) {
    return m_parentContext->defaultExpression();
  }
  Calculation * lastCalculation = m_calculationStore->calculationAtIndex(m_calculationStore->numberOfCalculations()-1);
#ifdef GIAC
  return lastCalculation->output(m_parentContext)->evaluate<double>(*m_parentContext);
#else
  return lastCalculation->output(m_parentContext);
#endif
}

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 14:27
by Adriweb
On veut des screenshots ! ;)

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 14:34
by parisse
Comment on fait pour faire une capture de fenetre sur Mac?

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 14:37
by Adriweb
Cmd+Shift+4 pour faire une capture par sélection. Une fois que le curseur apparait, on peut alors appuyer sur la barre d'espace pour lui dire de capturer des fenêtres joliment.
Logiquement la capture arrive dans le dossiers Images, il suffira de la glisser sur la zone de texte pour répondre ici, ou de l'héberger sur imgur ou autre.

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 14:41
by parisse
Voila:
Image

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 18:31
by parisse
Une autre plus formelle:
Image

Re: Numworks+Giac

Unread postPosted: 03 Sep 2017, 18:31
by clifward
Avoue, tu aimes bien nous faire baver devant quelque chose qui n'arrivera surement jamais... :(