[C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda DekraN » 30/08/2014, 14:46

Salve ragazzi, non ho trovato una sezione più apposita di questa per postare un mio progetto; in caso non lo fosse, prego mod e admin di scusarmi in quanto sono nuovo nel forum.

mathSuite - Powerful Calculus Environment and Matrices Handling Engine


Vorrei mostrarvi un mio progetto, che ormai mando avanti da più di un anno, riguardante un Ambiente di Analisi e Calcolo Numerico, mathSuite.
La pagina principale del progetto è:
mathSuite PROJECT Official Page

Riporto una descrizione sommaria in italiano:

mathSuite è una potente suite di calcolo completa scritta interamente in C che permette principalmente di effettuare complessi calcoli e manipolare i valori tramite variabili e di tenere traccia delle operazioni tramite dei logs. Racchiunde un set di funzioni tali da coprire calcoli trigonometrici, statistici, euristici, geometrici, algebrici e tanto altro...

Particolare sforzo alla realizzazione del programma è stato concentrato sul sistema di Gestione delle Matrici.

Le Matrici sono gli elementi principali per questo programma, di conseguenza numerose operazioni di Algebra Lineare sono state dedicate a questo tipo fondamentale. Esempi di queste operazioni sono:

- Fattorizzazione LU;
- Decomposizione in Valori Singolari (SVD);
- Prodotto e Somma tra Matrici;
- Prodotto di Kronecker tra Matrici;
- Calcolo del Determinante;
- Calcolo del Rango;
- Controllo Indice di Condizionamento;
- Tanto altro ancora...


Non mancano delle chicche a carattere generale, generalmente risiedenti nel programma Calcolatore Avanzato come:


- Operazioni tra numeri complessi;
- Risolutore di Sistemi Lineari;
- Integratore di Funzioni pre-caricate;
- Fit Equazioni Rette;
- Fit Equazioni Curve Paraboliche.

E' anche possibile, dalle ultime versioni, operare in Algebre Diverse da quella dei Numeri Reali. E' per esempio perfettamente possibile eseguire un prodotto di Kronecker tra due Matrici Sedenioniche (i cui elementi sono sedenioni!!), a patto che ovviamente si inseriscano sedici matrici, ognuna contenente i coefficienti delle parti immaginarie via via.


Inoltre, il programma accetta senza problemi in ingresso (nella Riga di Comando) dei comandi, che a loro volta accettano determinati parametri. Questa feature permette l'esecuzione in sequenza di più comandi del programma, configurandosi come un vero e proprio linguaggio di scripting, se utilizzato nella maniera giusta.

Download link: https://sourceforge.net/projects/mathsuite/files/latest/download
Pagina Facebook: https://www.facebook.com/mathsuite

Altri link utili:
https://code.google.com/p/mathsuite/
https://github.com/DekraN/mathSuite

Compatibilità: Windows 2000+. (Su ambienti Unix-like è necessario ricompilarlo, i sorgenti sono completamente aperti).

- NON richiede installazione, soltanto la copia della cartella mathSuite sul Desktop o qualsiasi altra cartella.


In futuro verrà ulteriormente espanso, e magari troverò delle basilari API OpenSource per quanto riguarda il Calcolo Simbolico ed introdurre inoltre un sistema molto più avanzato di Integrazione delle Funzioni basato su Espansioni in Serie, e Plotting 3D avanzato con OpenGL o qualche altra libreria (tipo GSL) magari, ma per ora la priorità è effettuare un porting in ambiente mobile (mathSMART).
Il progetto è completamente open-source. Se qualcuno è interessato a saperne di più posti tranquillamente qui o mi contatti in PVT :D

Regards, Wesker.
"Dio fece i numeri interi; tutto il resto è opera dell'uomo". (Leopold Kronecker)
Avatar utente
DekraN
Starting Member
Starting Member
 
Messaggio: 2 di 18
Iscritto il: 25/08/2014, 19:13
Località: Maglie (LECCE)

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda vict85 » 30/08/2014, 17:17

Sono curioso, cercando velocemente non l'ho trovato (sul sito). Come hai definito il tipo matrice?
vict85
Moderatore
Moderatore
 
Messaggio: 6754 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda DekraN » 30/08/2014, 18:50

vict85 ha scritto:Sono curioso, cercando velocemente non l'ho trovato (sul sito). Come hai definito il tipo matrice?


Di norma è una doppia referenza di tipo base "ityp" (dunque ityp **). ityp è definito di default come double, anche se in futuro conto di aumentare la precisione in virgola mobile.
"Dio fece i numeri interi; tutto il resto è opera dell'uomo". (Leopold Kronecker)
Avatar utente
DekraN
Starting Member
Starting Member
 
Messaggio: 3 di 18
Iscritto il: 25/08/2014, 19:13
Località: Maglie (LECCE)

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda vict85 » 31/08/2014, 09:14

Perché non una singola referenza come fanno in lapack e similari?
vict85
Moderatore
Moderatore
 
Messaggio: 6755 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda DekraN » 31/08/2014, 12:22

Puramente per motivi temporali, di velocità di scrittura del codice e di leggibilità. Non so sinceramente se questo influisca sulla velocità, ma a me è parso più comodo utilizzare questo sistema anziché operare direttamente con l'aritmetica dei puntatori
"Dio fece i numeri interi; tutto il resto è opera dell'uomo". (Leopold Kronecker)
Avatar utente
DekraN
Starting Member
Starting Member
 
Messaggio: 4 di 18
Iscritto il: 25/08/2014, 19:13
Località: Maglie (LECCE)

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda vict85 » 31/08/2014, 17:07

In realtà scrivere come dici tu è più complesso in definitiva: è vero che l'accesso agli elementi è più complesso da scrivere (in C, in C++ il problema viene risolto con dell'overload di operatori) ma la gestione della memoria lo è meno. E ci si abitua presto. Insomma le cose si compensano. Inoltre è probabilmente più lento il tuo metodo. Tieni conto che se passi un array multidimensionale a[n][m] statico a una funzione questo viene visto come un puntatore e non un puntatore di puntatori.
vict85
Moderatore
Moderatore
 
Messaggio: 6758 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda sapo93 » 31/08/2014, 19:38

Purtroppo non posso farlo andare sul mio pc (ho linux), ma leggendo il codice mi piace come progetto.

E' simile a quello che volevo fare di tesi, anche se il mio progetto sarà posto ad un livello più basso (incentrato sullo studio di lexer e parser da usare per il calcolo simbolico).

Ti consiglio se riesci di rendere il programma più portabile per farlo compilare su altri sistemi. L'input e l'output con Latex non sarebbe male :D
Java and C++ Developer (Algorithmic Trading)
M.Sc student (applied) Math Unimib
B. Sc Computer Science Unimib
Football coach
Emergency Medical Technician (EMT)
Sorcerer's apprentice

Github: https://github.com/fsaporito
Linkedin: https://www.linkedin.com/in/fsaporito/
sapo93
Junior Member
Junior Member
 
Messaggio: 67 di 402
Iscritto il: 10/03/2013, 14:09

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda DekraN » 31/08/2014, 19:52

vict85 ha scritto:In realtà scrivere come dici tu è più complesso in definitiva: è vero che l'accesso agli elementi è più complesso da scrivere (in C, in C++ il problema viene risolto con dell'overload di operatori) ma la gestione della memoria lo è meno. E ci si abitua presto. Insomma le cose si compensano. Inoltre è probabilmente più lento il tuo metodo. Tieni conto che se passi un array multidimensionale a[n][m] statico a una funzione questo viene visto come un puntatore e non un puntatore di puntatori.

Beh una volta scritte le API sulla gestione della memoria relativa alle matrici, che sarebbero semplicemente due funzioni, questa non è più un problema.
Sì, molto probabilmente hai ragione sulla velocità, in quanto renderebbe la memoria del programma meno segmentata credo ed è comunque sempre un livello di referenza in meno.
Grazie mille per il consiglio comunque, mi hai orientato verso una parziale ristrutturazione dei metodi di accesso alle matrici.

@sapo: Ti ringrazio, in effetti una volta che il motore di calcolo è completato ci si può sbizzarrire come vuole, il peggio è passato :D Veramente interessante l'idea di in/out con LaTeX!
"Dio fece i numeri interi; tutto il resto è opera dell'uomo". (Leopold Kronecker)
Avatar utente
DekraN
Starting Member
Starting Member
 
Messaggio: 5 di 18
Iscritto il: 25/08/2014, 19:13
Località: Maglie (LECCE)

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda DekraN » 04/09/2014, 17:03

Scusate il doppio post, ma volevo ringraziare mille volte vict85 per il suo prezioso consiglio.
Ho riscritto completamente il codice del programma, il che non è stata una passeggiata ma ne è valsa veramente la pena. Oltre ad una sensibile diminuzione dell'eseguibile, di circa il 4.1%, probabilmente relativo alla memorizzazione dei metadati dei blocchi di memoria aggiuntivi che allocavo, la velocità di elaborazione delle matrici, complice anche la qualificazione "restrict" che ho applicato a molti argomenti delle funzioni che le trattano, è aumentata notevolmente.

https://sourceforge.net/projects/mathsuite/
"Dio fece i numeri interi; tutto il resto è opera dell'uomo". (Leopold Kronecker)
Avatar utente
DekraN
Starting Member
Starting Member
 
Messaggio: 6 di 18
Iscritto il: 25/08/2014, 19:13
Località: Maglie (LECCE)

Re: [C] mathSuite v5.70 - Progetto di Analisi e Calcolo Numerico

Messaggioda vict85 » 04/09/2014, 18:21

Prego.

Una cosa, che non so se hai fatto e che può migliorare le prestazione, è usare il ciclo corretto. È una cosa che si trova su qualsiasi libro di programmazione parallela quindi forse l'hai fatto. Ma lo scrivo perché magari a qualcuno interessa. Molti algoritmi BLAS3, come per esempio il prodotto matriciale o la decomposizione LU, si basano su un ciclo comunemente segnato come ijk. Nel caso del prodotto matriciale si ha
Codice:
for(i=0; i != A_row; ++i)
  for(j=0; j != B_col; ++j) {
    c[i][j] = 0
    for(k=0; k != A_col; ++k)
      C[i][j] += A[i][k] * B[k][j];

D'altra parte ci sono 6 possibili modi di permutare i coefficienti che producono lo stesso risultato. Si noti che ijk è un prodotto riga per colonna. Quindi legge A per righe (C-style), B per colonne (Fortran-Style) e C per righe. Quello che è necessario per migliorare le performance è leggere tutto per righe (o per colonne se hai scritto le matrici alla Fortran).
Il ciclo che lo fa è, se non ricordo male, il seguente:
Codice:
for(i=0; i != A_row; ++i)
  for(j=0; j != B_col; ++j)
    c[i][j] = 0;

for(i=0; i != A_row; ++i)
  for(k=0; k != A_col; ++k)
    for(j=0; j != B_col; ++j)
      C[i][j] += A[i][k] * B[k][j];


Questo metodo è ulteriormente migliorabile, ma usare il ciclo sbagliato può peggiorare le performance sensibilmente. Non sono comunque un esperto e le mie conoscenze non vanno troppo più in là.
vict85
Moderatore
Moderatore
 
Messaggio: 6764 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite