Hi all. I am porting my ruby model to clojure, and wondered if any of
you could comment_on / rewrite_to_a_more_clojure-way the following
four functions.

The purpose of it all is to generate a regular expression, which is
ran past a string. This is used as a simple way to mimic the antigen
presentation pathway that recognizes certain patterns in viruses.


; some constants
(def amino_acids 10)
(def window_size 9)
(def virus_length 1000)

; generates a virus
; there is probably an easier way to create a random string
(reduce str (take virus_length (map #(char (+ (rand-int amino_acids)
65 %)) (cycle (list 0)))))

; I start with a fully indiscriminate gene (i.e. (10 10 10 10 10 10 10
10 10)),
; and reduce those numbers till the 1/multiplication of that whole
string is
; lower than the given specificity. This will generate a list that
when transformed
; into a regexp will for example only return matches for 10% of a
random string.
(defn construct-specificity
  "reduces a list to a certain specificity"
  [gene specificity]
  (if (> (reduce * (map #(/ % amino_acids) gene)) specificity)
    (construct-specificity (map (fn [_] (if (< (rand) (/ 0.1 (count
gene))) (max (dec _) 1) _)) gene) specificity)
    gene))

; This one translates a number into a set of letters.
; 2 would be translated into #{\C \F}, or #{\A \D}
; etc. In this way we can translate (1 5 3 2 6) into
; something like (#{\C} #{\A \C \F \G \H} #{\B \C \F} etc..
(defn construct-atom
  "translates a number n into an set of letters of size n"
  [construct length]
  (if (< (count construct) length)
    (construct-atom (conj construct (char (+ (rand-int amino_acids)
65))) length)
    construct))

; This turns the seq of sets into a regexp
(defn construct-regexp
  "creates a gene (i.e. a list of sets) and forms it into a regexp"
  [specificity]
  (let [gene (map #(reduce str (construct-atom #{} %)) (construct-
specificity (replicate window_size amino_acids) specificity))]
    (re-pattern (str "(?=(" (reduce str (map #(str "[" % "]") gene))
"))"))))

; done! works!
(re-seq (construct-regexp 0.3)
"ABCCABABABCDADFAFDACCCADFABADFASACSADFBA")



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to