mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Added fasta example.
This commit is contained in:
105
resources/examples/fasta.c3
Normal file
105
resources/examples/fasta.c3
Normal file
@@ -0,0 +1,105 @@
|
||||
module fasta;
|
||||
|
||||
const IM = 139968;
|
||||
const IA = 3877;
|
||||
const IC = 29573;
|
||||
const SEED = 42;
|
||||
|
||||
uint seed = SEED;
|
||||
|
||||
func float fasta_rand(float max)
|
||||
{
|
||||
seed = (seed * IA + IC) % IM;
|
||||
return max * seed / IM;
|
||||
}
|
||||
|
||||
private char[] alu =
|
||||
"GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG"
|
||||
"GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA"
|
||||
"CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT"
|
||||
"ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA"
|
||||
"GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG"
|
||||
"AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"
|
||||
"AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA";
|
||||
|
||||
extern func int atoi(char *s);
|
||||
extern func int printf(char *s, ...);
|
||||
extern func void putchar(int c);
|
||||
|
||||
char[] iub = "acgtBDHKMNRSVWY";
|
||||
double[*] iub_p = {
|
||||
0.27,
|
||||
0.12,
|
||||
0.12,
|
||||
0.27,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02,
|
||||
0.02 };
|
||||
|
||||
char[] homosapiens = "acgt";
|
||||
double[*] homosapiens_p = {
|
||||
0.3029549426680,
|
||||
0.1979883004921,
|
||||
0.1975473066391,
|
||||
0.3015094502008
|
||||
};
|
||||
|
||||
const LINELEN = 60;
|
||||
|
||||
// slowest character-at-a-time output
|
||||
func void repeat_fasta(char[] seq, int n)
|
||||
{
|
||||
usize len = seq.len();
|
||||
int i = void;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
putchar(seq[i % len]);
|
||||
if (i % LINELEN == LINELEN - 1) putchar('\n');
|
||||
}
|
||||
if (i % LINELEN != 0) putchar('\n');
|
||||
}
|
||||
|
||||
func void random_fasta(char[] symb, double[] probability, int n)
|
||||
{
|
||||
assert(symb.len() == probability.len());
|
||||
int len = (int)(probability.len());
|
||||
int i = void;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
double v = fasta_rand(1.0);
|
||||
/* slowest idiomatic linear lookup. Fast if len is short though. */
|
||||
int j = void;
|
||||
for (j = 0; j < len - 1; j++)
|
||||
{
|
||||
v -= probability[j];
|
||||
if (v < 0) break;
|
||||
}
|
||||
putchar(symb[j]);
|
||||
if (i % LINELEN == LINELEN - 1) putchar('\n');
|
||||
}
|
||||
if (i % LINELEN != 0) putchar('\n');
|
||||
}
|
||||
|
||||
func void main(int argc, char **argv)
|
||||
{
|
||||
int n=1000;
|
||||
if (argc > 1) n = atoi(argv[1]);
|
||||
|
||||
printf(">ONE Homo sapiens alu\n");
|
||||
repeat_fasta(alu, n * 2);
|
||||
|
||||
printf(">TWO IUB ambiguity codes\n");
|
||||
random_fasta(iub, &iub_p, n * 3);
|
||||
|
||||
printf(">THREE Homo sapiens frequency\n");
|
||||
random_fasta(homosapiens, &homosapiens_p, n * 5);
|
||||
|
||||
}
|
||||
@@ -94,6 +94,10 @@ LLVMValueRef llvm_emit_const_initializer(GenContext *c, ConstInitializer *const_
|
||||
LLVMTypeRef element_type_llvm = llvm_get_type(c, element_type);
|
||||
ConstInitializer **elements = const_init->init_array_full;
|
||||
ArrayIndex size = array_type->array.len;
|
||||
if (array_type->type_kind == TYPE_SUBARRAY)
|
||||
{
|
||||
size = vec_size(elements);
|
||||
}
|
||||
assert(size > 0);
|
||||
LLVMValueRef *parts = VECNEW(LLVMValueRef, size);
|
||||
for (ArrayIndex i = 0; i < size; i++)
|
||||
|
||||
@@ -3096,18 +3096,18 @@ static inline bool sema_expr_analyse_array_plain_initializer(Context *context, T
|
||||
ConstInitializer *const_init = CALLOCS(ConstInitializer);
|
||||
const_init->kind = CONST_INIT_ARRAY_FULL;
|
||||
const_init->type = type_flatten(initializer->type);
|
||||
ConstInitializer **inits = MALLOC(sizeof(ConstInitializer *) * vec_size(elements));
|
||||
ConstInitializer **inits = VECNEW(ConstInitializer*, vec_size(elements));
|
||||
VECEACH(elements, i)
|
||||
{
|
||||
Expr *expr = elements[i];
|
||||
if (expr->expr_kind == EXPR_CONST && expr->const_expr.const_kind == CONST_LIST)
|
||||
{
|
||||
inits[i] = expr->const_expr.list;
|
||||
vec_add(inits, expr->const_expr.list);
|
||||
continue;
|
||||
}
|
||||
ConstInitializer *element_init = MALLOC(sizeof(ConstInitializer));
|
||||
sema_create_const_initializer_value(element_init, expr);
|
||||
inits[i] = element_init;
|
||||
vec_add(inits, element_init);
|
||||
}
|
||||
const_init->init_array_full = inits;
|
||||
expr_set_as_const_list(initializer, const_init);
|
||||
|
||||
Reference in New Issue
Block a user