mrb_value mat4_invert_inplace(mrb_state* mrb, mrb_value self) { mat4* m = mat4_get_ptr(mrb, self); mat4 inv = generate_inverse(m);; memcpy(m, &inv, sizeof(mat4)); return self; }
mrb_value mat4_invert(mrb_state* mrb, mrb_value self) { mat4* m = mat4_get_ptr(mrb, self); mat4* newMatrix = allocate_new_mat4(mrb); mat4 inv = generate_inverse(m); memcpy(newMatrix, &inv, sizeof(mat4)); return mat4_wrap(mrb, newMatrix); }
static struct fsm *fsm_minimize_hop(struct fsm *net) { struct e *temp_E; struct trans_array *tptr; struct trans_list *transitions; int i,j,minsym,next_minsym,current_i, stateno, thissize, source; unsigned int tail; fsm_count(net); if (net->finalcount == 0) { fsm_destroy(net); return(fsm_empty_set()); } num_states = net->statecount; P = NULL; /* 1. generate the inverse lookup table 2. generate P and E (partitions, states linked list) 3. Init Agenda = {Q, Q-F} 4. Split until Agenda is empty */ sigma_to_pairs(net); init_PE(); if (total_states == num_states) { goto bail; } generate_inverse(net); Agenda_head->index = 0; if (Agenda_head->next != NULL) Agenda_head->next->index = 0; for (Agenda = Agenda_head; Agenda != NULL; ) { /* Remove current_w from agenda */ current_w = Agenda->p; current_i = Agenda->index; Agenda->p->agenda = NULL; Agenda = Agenda->next; /* Store current group state number in tmp_group */ /* And figure out minsym */ /* If index is 0 we start splitting from the first symbol */ /* Otherwise we split from where we left off last time */ thissize = 0; minsym = INT_MAX; for (temp_E = current_w->first_e; temp_E != NULL; temp_E = temp_E->right) { stateno = temp_E - E; *(temp_group+thissize) = stateno; thissize++; tptr = trans_array+stateno; /* Clear tails if symloop should start from 0 */ if (current_i == 0) tptr->tail = 0; tail = tptr->tail; transitions = (tptr->transitions)+tail; if (tail < tptr->size && transitions->inout < minsym) { minsym = transitions->inout; } } for (next_minsym = INT_MAX; minsym != INT_MAX ; minsym = next_minsym, next_minsym = INT_MAX) { /* Add states to temp_move */ for (i = 0, j = 0; i < thissize; i++) { tptr = trans_array+*(temp_group+i); tail = tptr->tail; transitions = (tptr->transitions)+tail; while (tail < tptr->size && transitions->inout == minsym) { source = transitions->source; if (*(memo_table+(source)) != mainloop) { *(memo_table+(source)) = mainloop; *(temp_move+j) = source; j++; } tail++; transitions++; } tptr->tail = tail; if (tail < tptr->size && transitions->inout < next_minsym) { next_minsym = transitions->inout; } } if (j == 0) { continue; } mainloop++; if (refine_states(j) == 1) { break; /* break loop if we split current_w */ } } if (total_states == num_states) { break; } } net = rebuild_machine(net); xxfree(trans_array); xxfree(trans_list); bail: xxfree(Agenda_top); xxfree(memo_table); xxfree(temp_move); xxfree(temp_group); xxfree(finals); xxfree(E); xxfree(Phead); xxfree(single_sigma_array); xxfree(double_sigma_array); return(net); }