Salut les amies,

Alors j'ai un problème je ne me retrouve plus dans mon code. Je vous fais un résumé :

Une page est appélé et un formulaire s'ouvre : on dois taper une chaine de caractère de la forme 1,2,3 si pas bug !

<?php
/**
*
*/
class MatrixComponent extends Component
{

// je peux définir les variables de bases sans faire l'init de diagonalize
// mais je peux aussi traiter autremzent la matrice !
//

public $controller =false;
public $M = '';
public $T = '';
public $dim = ''; // reconstruire la classe !

// l'idée c'est que je fais toutes les manipulations que je veux mais sympy se lance une fois seulement
//

// complexe mais cake veut ça !
// ce truc me permet de récupérer les infos et je n'ai plus besoin de passer en variant
// $M ?

public function __construct(ComponentCollection $collection, $settings = array()){
// $this->dim = setDim($M);

$this->controller = $collection->getcontroller();
$data =$this->controller->request->data;
// $this->dim =
// je peux initialise tous comme je veux :)
$this->M = $data'matrice'];
$this->dim = count(explode(',',$data'matrice']));
$this->T = "T=".$this->createTriangMatrix($this->dim);

}

// Fonctions d'initialisations principales !

// initialise toute les variables init_diagonize_$var

public function init_diagonize($M){
// $m='1,2,3'

$init=array();

$pattern = '/^init_diagonize/';
foreach (get_class_methods($this) as $method) {
if($method != __FUNCTION__ ){
if(preg_match($pattern, $method)){
array_push($init, $this->name($method)."=".call_user_func(array($this,$method),$M));
}
}
}
// debug($init);die();
// debug($init);
return $init;
}

// initialise toute les variables init_suite_$var
// Remarque attention a l'ordre des fonctions c'est important pour sympy !

public function init_diagonize_m($M){

return count(explode(',',trim($M)));
}

public function init_diagonize_spec($M){
return $M; // variable de class
}

// init du polynome caracteristique

public function init_diagonize_car($M){
$M=explode(',',trim($M));
$car ='';
foreach ($M as $coef) {
$car =$car."(x-$coef)*";
}
return 'expand ('.substr($car, 0, -1).')'; // rapide n=3 ou 4
}

public function init_diagonize_D($M){
$M=explode(',',trim($M));
return $this->ConstructMatrix($this->diag($M)); // diag
}

public function init_diagonize_T($M){
return $this->T;
}

// Pour twiter les trucs
public function init_diagonize_P($M){
return 'Matrix(3,3,[1,0,1,-1,1,0,2,0,1])';
}

public function init_diagonize_PT($M){
return 'P*T';
}

public function init_diagonize_A($M){
return "PT.inv()*D*PT";
}

// suite_init

public function init_diagonize_Dn($M){
$M=explode(',',trim($M));
foreach ($M as $k =>$coef) {
$M$k] = '('.$M$k].")**n";
}
return $this->constructMatrix($this->diag($M));
}

public function init_suite_An(){
return "PT.inv()*Dn*PT";
}

public function init_suite_Xo(){
return $this->ConstructVector(array('1','1','0'));
}

public function init_suite_X(){
return $this->ConstructVector(array('u_n','v_n','w_n'));
}

public function init_suite_AX(){
return 'A*X';
}

public function init_suite_AnXo(){
return 'An*Xo';
}

// Fonctions utilitaires

// Permet d'initialiser la bonne variable pour sympy

public function name($nom){
$nom = explode('_',$nom);
return end($nom);
}

// Permet de créer une matrice inversible (ici triangulaire) de taille $n

public function createTriangMatrix($n){
$M = array();
for ($i = 1; $i <= $n*$n; $i++) {
if ( $i % ($n) != 0){
$c = $i % ($n);
}else{
$c=$n;
}
$l=(($i-$c)/($n)+1);

if ( $l==$c){
$M$i] = 1;
}else{
if($l>$c){
$M$i]= 0;
}else{
$M$i]=rand(-1,2);
}
}
}

$M = $this->ConstructMatrix($M);
return $M;
}

public function diag($matrix){
$n=count($matrix);
$M = array();
for ($i = 1; $i <= $n*$n; $i++) {
$v = $i % ($n+1);
if ( $v == 1){
$M$i] = $matrix[strval(gmp_intval(gmp_sqrt(strval($i)))-1)];
}
else {$M$i]= 0;}
}
return $M;
}

public function ConstructMatrix($matrixList){
$n = sqrt(count($matrixList));
return 'Matrix('.$n.','.$n.','.implode(',',$matrixList).'])';
}

public function ConstructVector($vectorList){
$n= count($vectorList);
return 'Matrix('.$n.',1,'.implode(',',$vectorList).'])';
}

}

Vous pensez que c'est bien d'initialisé une variable à l'aide du nom de la fonction que je fais ???

2 réponses


Acxelle Anbra
Auteur
Réponse acceptée

Oui, ok ! mais j'ai complétement refait le système ! != pour me répondre : mon système était con ! initialiser des variable a partir du nom de la fonction c'est un peu trop lourd ! Mais no soucis j'ai fais (put you're favorite number here) mieux ?
Donc plus besoin d'initialisation depuis php ! Mais je lance un script python pour faire mes calculs de maths, et je créer mes helper a la volée !

class LatexComponent extends Component{
    public function latex($datas){  

        $file="python/restrucScript.py";
        $contenu=file_get_contents($file);

        $ligne1 = implode("\n", $datas);
        $contenu = '$'.$ligne1."\n".$contenu;
        return $this->latex_rest($contenu);
    }

    public function insert($datas,$files){
        $fichier="python/test1.py";
        $text=fopen($fichier,'r') or die("Fichier manquant");
        $contenu=file_get_contents($fichier);
        // debug($contenu);
        $contenuMod=str_replace('fonction', $datas,$contenu);
        fclose($text);
        //ouverture en écriture du fichier 

        $text2=fopen($files,'w+') or die("Fichier manquant");
        // remplacement du mot clé fonction par la valeur de la fonction
        fwrite($text2,$contenuMod);
        fclose($text2);
        // return true;
    }
    public function latex_rest($datas){

    $datas_array = explode("\n",$datas);
    $datas=implode("\n",$datas_array);
    foreach ($datas_array as $key => $ligne) {
        $pattern_1 = '`^$]{1}^$](.*)`';
        $pattern_2 = '`$]{2}(.*)`';
        if(preg_match($pattern_1, $ligne)){
             $ligne = str_replace('$', '',$ligne);
             $ligne_array = explode('=',$ligne);
             $nom = $ligne_array[0];
             $ligne=$ligne."\n".'fichier.write("'.$nom.'__"+latex('.$nom.')+"\n")';
             echo($ligne).'</br>';
            $datas_array$key] = $ligne;

        }
        if(preg_match($pattern_2, $ligne)){
            if(!isset($echap_python)){
                debug($ligne);
                $echap_python=explode('$$',$ligne)[0];
                debug($echap_python);
                 // $echap_python =explode('P',$ligne_array[0])[0];
            }
            $ligne = str_replace('$', '',$ligne);
            $ligne_array = explode('=',$ligne);
            $nom = trim(explode('+',$ligne_array[0],2)[0]);
            $nom_meth = trim(explode('(',$ligne_array[1])[0]);
            $args = '('.explode('(',$ligne_array[1],2)[1];
            $ligne=$echap_python.'define('."'".$nom."',i)"."\n".$echap_python.'As('.$nom_meth.$args.')';
            $datas_array$key] = $ligne;
        }

    }
    $datas=implode("\n",$datas_array);
    $files = "python/restruc_temp.py";
    $this->insert($datas,$files);

    system('python python/restruc_temp.py');

// traitement du fichier latex de sortie ! 

                    $file="python/res1";
                    $res =fopen($file,'r') or die("Fichier manquant");
                    $contenu=file_get_contents($file);

                    $contenu = explode("\n",$contenu);

                    // echo 'contenu';
                    // debug($contenu);

                    $a = array();
                    foreach ($contenu as $ligne) {
                        $ligne = explode('__',$ligne);
                        debug($ligne);
                        $a$ligne[0]] = $ligne[1];
                    }

                    fclose($res);
                    array_pop($a);
                    debug($a);
                    return $a; 

            }   
}

Si tu souhaites avoir de l'aide, je te conseillerais de mettre ton code dans la balise « [code] » et d'utiliser des variables nommées. Car pour le moment, c'est pas terrible pour comprendre le code. Ramz.