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 ???
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.