Fork me on GitHub
#clojure-italy
<
2020-01-27
>
reborg09:01:33

Buon inizio settimana!

andrea.crotti12:01:56

giorno a tutti

andrea.crotti12:01:13

sto cercando un modo di implementare qualcosa di questo tipo, ho una mappa di funzioni tipo

(def mapping
  {[:a :b] #(* 1000 %)
   [:b :c] #(* 2 %)})

andrea.crotti12:01:38

vorrei automaticamente generare tutto lo spazio cartesiano di funzioni, invertedendo o componendo funzioni (assumendo che siano transitive etc)

andrea.crotti12:01:42

(def generated-mapping
  {[:a :b] #(* 1000 %)
   [:b :a] #(/ % 1000)
   [:b :c] #(* 2 %)
   [:c :b] #(/ % 2)
   [:a :c] (comp f-a-b f-a-c)
   ...})

andrea.crotti12:01:04

vorrei generare automaticamente una cosa del genere

andrea.crotti12:01:14

qualche suggerimento su che algoritmi usare?

andrea.crotti12:01:01

probabilmente dovrei prima fare gli inversi e poi un BFS per "riempire" tutta la tabella

andrea.crotti12:01:28

forse gli inversi non posso farli automaticamente comunque se non riesce a trovare l'inversa in automatico, ma vabbeh quelli li posso scrivere per esteso

reborg12:01:52

gli inversi possono venire con qualcosa tipo

(let [[op op1 op2] (replace {'* '/ '/ '*} '(* 1000 %))] `(~op ~op2 ~op1))

andrea.crotti12:01:17

eh ma non e' sempre una semplice moltiplicazione/divisione

andrea.crotti12:01:20

dovrei mappare da qualche parte come gli inversi, ma vabbeh non ha senso forse, in totale ho 25 possibili conversioni possibili. scrivendone il meno possibile sono 4, con gli inversi 8

andrea.crotti18:01:55

ok ancora non funziona tutto ma penso di sapere come fare

andrea.crotti18:01:19

da

(def mapping
  {[:a :b] #(* 1000 %)
   [:b :c] #(* 2 %)})
estraggo il possible path, in questo caso (:a 😛 :c)

andrea.crotti18:01:42

maledetto mi cambia la ":b" a tutti i costi

andrea.crotti18:01:31

una volta che ho il path posso e :a :c come input della trasformazione da generare posso fare una roba del genere

(defn get-subs
  [from-type]
  (->> flow
       (drop-while #(not= from-type %))
       (partition 2)))


(defn get-transformation*
  [from-type to-type]
  ;; need to add the to-type here and then it's done
  (apply comp
         (map
          #(get conversions %)
          (get-subs from-type))))

andrea.crotti18:01:03

facendo le partizioni di tutte le transformazioni intermedie e componendole

andrea.crotti18:01:37

devo solo capire adesso come prendere una lista fino a un certo valore tipo [1 2 3 4] e voglio solo da 2 a 3

andrea.crotti18:01:56

drop-while funziona per il valore iniziale ma take-while non per il valore finale

andrea.crotti18:01:09

una volta risolto questo penso che funzioni tutto

bronsa20:01:54

subvec per vettori

andrea.crotti22:01:30

Eh no perché non sono numeri

andrea.crotti22:01:40

Tutto risolto su #clojure comunque

andrea.crotti22:01:28

Sono abbastanza soddisfatto del risultato, fra non molto magari rilascio OSS questa mini libreria

andrea.crotti22:01:01

Che magari serve a qualcun altro