/*********************************************************** * Name: init_model_proj * * Arguments: * APP_STATE_T *state - holds OGLES model info * * Description: Sets the OpenGL|ES model to default values * * Returns: void * ***********************************************************/ static void init_model_proj (APP_STATE_T * state) { float nearp = 1.0f; float farp = 500.0f; float hht; float hwd; glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glViewport (0, 0, (GLsizei) state->screen_width, (GLsizei) state->screen_height); glMatrixMode (GL_PROJECTION); glLoadIdentity (); hht = nearp * (float) tan (45.0 / 2.0 / 180.0 * M_PI); hwd = hht * (float) state->screen_width / (float) state->screen_height; glFrustumf (-hwd, hwd, -hht, hht, nearp, farp); glEnableClientState (GL_VERTEX_ARRAY); glVertexPointer (3, GL_BYTE, 0, quadx); reset_model (state); }
//完成windows的CreateWindowEx函数系列,此函数名任取 BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) { GLuint PixelFormat; // Holds The Results After Searching For A Match WNDCLASS wc; // Windows Class Structure|10成员窗口类别结构 DWORD dwExStyle; // Window Extended Style DWORD dwStyle; // Window Style RECT WindowRect; // Grabs Rectangle Upper Left / Lower Right Values|窗口区域大小 WindowRect.left=(long)0; // Set Left Value To 0 WindowRect.right=(long)width; // Set Right Value To Requested Width WindowRect.top=(long)0; // Set Top Value To 0 WindowRect.bottom=(long)height; // Set Bottom Value To Requested Height fullscreen=fullscreenflag; // Set The Global Fullscreen Flag hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window. wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc Handles Messages wc.cbClsExtra = 0; // No Extra Window Data wc.cbWndExtra = 0; // No Extra Window Data wc.hInstance = hInstance; // Set The Instance wc.hIcon = (HICON)LoadImage(NULL,"Data/i0.ico",IMAGE_ICON,0,0,LR_LOADFROMFILE); // 加载一个外部图标 wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer wc.hbrBackground = NULL; // No Background Required For GL wc.lpszMenuName = NULL; // We Don't Want A Menu wc.lpszClassName = "OpenGL"; // Set The Class Name if (!RegisterClass(&wc)) // Attempt To Register The Window Class { MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } //全屏模式下的相关设置 if (fullscreen) // Attempt Fullscreen Mode? { DEVMODE dmScreenSettings; // Device Mode memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The Devmode Structure dmScreenSettings.dmPelsWidth = width; // Selected Screen Width dmScreenSettings.dmPelsHeight = height; // Selected Screen Height dmScreenSettings.dmBitsPerPel = bits; // Selected Bits Per Pixel dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) //如果全屏模式没有设置成功 { // If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode. if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { fullscreen=FALSE; // Windowed Mode Selected. Fullscreen = FALSE } else { // Pop Up A Message Box Letting User Know The Program Is Closing. MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP); return FALSE; // Return FALSE } } } if (fullscreen) // Are We Still In Fullscreen Mode?|如果还在全屏模式需要一些辅助设置 { dwExStyle=WS_EX_APPWINDOW; // Window Extended Style|强制窗体位于最前 dwStyle=WS_POPUP; // Windows Style|没有边框 ShowCursor(FALSE); // Hide Mouse Pointer|隐藏鼠标指针 } else { dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style } AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size|调整绘图区域为设置的分辨率,即稍微扩大边框区域,仅对非全屏模式有效 // Create The Window if (!(hWnd=CreateWindowEx( dwExStyle, // Extended Style For The Window "OpenGL", // Class Name title, // Window Title dwStyle | // Defined Window Style WS_CLIPSIBLINGS | // Required Window Style WS_CLIPCHILDREN, // Required Window Style 0, 0, // Window Position WindowRect.right-WindowRect.left, // Calculate Window Width WindowRect.bottom-WindowRect.top, // Calculate Window Height NULL, // No Parent Window NULL, // No Menu hInstance, // Instance NULL))) // Dont Pass Anything To WM_CREATE { KillGLWindow(); // Reset The Display MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be { sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor 1, // Version Number PFD_DRAW_TO_WINDOW | // Format Must Support Window PFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_TYPE_RGBA, // Request An RGBA Format bits, // Select Our Color Depth 0, 0, 0, 0, 0, 0, // Color Bits Ignored 0, // No Alpha Buffer 0, // Shift Bit Ignored 0, // No Accumulation Buffer 0, 0, 0, 0, // Accumulation Bits Ignored 16, // 16Bit Z-Buffer (Depth Buffer) 0, // No Stencil Buffer 0, // No Auxiliary Buffer PFD_MAIN_PLANE, // Main Drawing Layer 0, // Reserved 0, 0, 0 // Layer Masks Ignored }; if (!(hDC=GetDC(hWnd))) // Did We Get A Device Context? { KillGLWindow(); // Reset The Display MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format? { KillGLWindow(); // Reset The Display MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format? { KillGLWindow(); // Reset The Display MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } if (!(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context? { KillGLWindow(); // Reset The Display MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } //wglMakeCurrent(hDC, hRC)执行之后OpenGL窗口创建工作完成 if(!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context { KillGLWindow(); // Reset The Display MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } ShowWindow(hWnd,SW_SHOW); // Show The Window SetForegroundWindow(hWnd); // Slightly Higher Priority SetFocus(hWnd); // Sets Keyboard Focus To The Window ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen reset_model(); //调用InitGL() if (!InitGL()) // Initialize Our Newly Created GL Window { KillGLWindow(); // Reset The Display MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } return TRUE; // Success }
/*********************************************************** * Name: init_model_proj * * Arguments: * APP_STATE_T *state - holds OGLES model info * * Description: Sets the OpenGL|ES model to default values * * Returns: void * ***********************************************************/ static void init_model_proj (APP_STATE_T * state) { GLint ret = 0; state->vshader = glCreateShader (GL_VERTEX_SHADER); glShaderSource (state->vshader, 1, &cube_v_src, NULL); glCompileShader (state->vshader); assert (glGetError () == GL_NO_ERROR); state->fshader = glCreateShader (GL_FRAGMENT_SHADER); glShaderSource (state->fshader, 1, &cube_f_src, NULL); glCompileShader (state->fshader); assert (glGetError () == GL_NO_ERROR); state->program = glCreateProgram (); glAttachShader (state->program, state->vshader); glAttachShader (state->program, state->fshader); glBindAttribLocation (state->program, 0, "a_position"); glBindAttribLocation (state->program, 1, "a_texCoord"); glLinkProgram (state->program); glGetProgramiv (state->program, GL_LINK_STATUS, &ret); assert (ret == GL_TRUE); glUseProgram (state->program); state->u_rotx = glGetUniformLocation (state->program, "u_rotx"); state->u_roty = glGetUniformLocation (state->program, "u_roty"); state->u_rotz = glGetUniformLocation (state->program, "u_rotz"); state->u_modelviewmatrix = glGetUniformLocation (state->program, "u_modelview"); state->u_projectionmatrix = glGetUniformLocation (state->program, "u_projection"); state->s_texture = glGetUniformLocation (state->program, "s_texture"); glViewport (0, 0, (GLsizei) state->screen_width, (GLsizei) state->screen_height); state->fov = 45.0f; state->distance = 5.0f; state->aspect = (GLfloat) state->screen_width / (GLfloat) state->screen_height; gst_gl_matrix_load_identity (&state->projection); gst_gl_matrix_perspective (&state->projection, state->fov, state->aspect, 1.0f, 100.0f); gst_gl_matrix_load_identity (&state->modelview); gst_gl_matrix_translate (&state->modelview, 0.0f, 0.0f, -state->distance); reset_model (state); }
int main(int argc, char *argv[]){ int i, j, k, n, t = 0; double** quotient = NULL; double*** result = NULL; /* probs of the hidden variables */ nip model = NULL; nip_clique clique_of_interest = NULL; nip_variable temp = NULL; nip_variable interesting = NULL; time_series *ts_set = NULL; time_series ts = NULL; /*************************************/ /* Some experimental timeslice stuff */ /*************************************/ /*****************************************/ /* Parse the model from a Hugin NET file */ /*****************************************/ /* -- Start parsing the network definition file */ if(argc < 3){ printf("Give the names of the net-file and data file, please!\n"); return 0; } else model = parse_model(argv[1]); if(model == NULL) return -1; /* The input file has been parsed. -- */ /*****************************/ /* read the data from a file */ /*****************************/ n = read_timeseries(model, argv[2], &ts_set); /* 1. Open */ if(n == 0){ free_model(model); nip_report_error(__FILE__, __LINE__, NIP_ERROR_INVALID_ARGUMENT, 1); fprintf(stderr, "%s\n", argv[2]); return -1; } ts = ts_set[0]; /* Allocate some space for filtering */ assert(ts->num_of_hidden > 0); result = (double***) calloc(TIME_SERIES_LENGTH(ts) + 1, sizeof(double**)); quotient = (double**) calloc(ts->num_of_hidden, sizeof(double*)); if(!(result && quotient)){ free_model(model); nip_report_error(__FILE__, __LINE__, NIP_ERROR_OUTOFMEMORY, 1); return 1; } for(t = 0; t < TIME_SERIES_LENGTH(ts) + 1; t++){ result[t] = (double**) calloc(ts->num_of_hidden, sizeof(double*)); if(!result[t]){ free_model(model); nip_report_error(__FILE__, __LINE__, NIP_ERROR_OUTOFMEMORY, 1); return 1; } for(i = 0; i < ts->num_of_hidden; i++){ result[t][i] = (double*) calloc(NIP_CARDINALITY(ts->hidden[i]), sizeof(double)); if(!result[t][i]){ free_model(model); nip_report_error(__FILE__, __LINE__, NIP_ERROR_OUTOFMEMORY, 1); return 1; } } } for(i = 0; i < ts->num_of_hidden; i++){ quotient[i] = (double*) calloc(NIP_CARDINALITY(ts->hidden[i]), sizeof(double)); if(!quotient[i]){ free_model(model); nip_report_error(__FILE__, __LINE__, NIP_ERROR_OUTOFMEMORY, 1); return 1; } } /*****************/ /* Forward phase */ /*****************/ printf("## Forward phase ##\n"); reset_model(model); /* Reset the clique tree */ use_priors(model, !NIP_HAD_A_PREVIOUS_TIMESLICE); for(t = 0; t < TIME_SERIES_LENGTH(ts); t++){ /* FOR EVERY TIMESLICE */ printf("-- t = %d --\n", t); /********************/ /* Do the inference */ /********************/ make_consistent(model); /* an experimental forward phase (a.k.a. filtering)... */ /* Calculates the result values */ for(i = 0; i < ts->num_of_hidden; i++){ /*********************************/ /* Check the result of inference */ /*********************************/ /* 1. Decide which variable you are interested in */ interesting = ts->hidden[i]; /* 2. Find the clique that contains the family of * the interesting variable */ clique_of_interest = nip_find_family(model->cliques, model->num_of_cliques, interesting); if(!clique_of_interest){ free_model(model); free_timeseries(ts); printf("In hmmtest.c : No clique found! Sorry.\n"); return 1; } /* 3. Marginalisation (memory for the result must have been allocated) */ nip_marginalise_clique(clique_of_interest, interesting, result[t][i]); /* 4. Normalisation */ nip_normalise_array(result[t][i], NIP_CARDINALITY(interesting)); /* 5. Print the result */ for(j = 0; j < NIP_CARDINALITY(interesting); j++) printf("P(%s=%s) = %f\n", nip_variable_symbol(interesting), (interesting->state_names)[j], result[t][i][j]); printf("\n"); } if(t < TIME_SERIES_LENGTH(ts)){ /* forget old evidence */ reset_model(model); use_priors(model, NIP_HAD_A_PREVIOUS_TIMESLICE); for(i = 0; i < ts->num_of_hidden; i++){ /* old posteriors become new priors */ temp = ts->hidden[i]; if(temp->next != NULL) nip_update_likelihood(temp->next, result[t][i]); } nip_global_retraction(model->variables, model->num_of_vars, model->cliques, model->num_of_cliques); /* 0. Put some data in */ for(i = 0; i < model->num_of_vars - ts->num_of_hidden; i++) if(ts->data[t][i] >= 0) nip_enter_index_observation(model->variables, model->num_of_vars, model->cliques, model->num_of_cliques, ts->observed[i], ts->data[t][i]); } } /******************/ /* Backward phase */ /******************/ printf("## Backward phase ##\n"); /* forget old evidence */ reset_model(model); use_priors(model, NIP_HAD_A_PREVIOUS_TIMESLICE); /* JJT: Not sure... */ for(t = TIME_SERIES_LENGTH(ts)-1; t >= 0; t--){ /* FOR EVERY TIMESLICE */ printf("-- t = %d --\n", t); if(t > 0){ for(i = 0; i < model->num_of_vars - ts->num_of_hidden; i++){ temp = ts->observed[i]; assert(temp); if(ts->data[t - 1][i] >= 0) nip_enter_index_observation(model->variables, model->num_of_vars, model->cliques, model->num_of_cliques, temp, ts->data[t - 1][i]); } for(i = 0; i < ts->num_of_hidden; i++){ temp = ts->hidden[i]; if(temp->next != NULL) nip_enter_evidence(model->variables, model->num_of_vars, model->cliques, model->num_of_cliques, temp->next, result[t-1][i]); } } if(t < TIME_SERIES_LENGTH(ts)){ for(i = 0; i < ts->num_of_hidden; i++){ temp = ts->hidden[i]; if(temp->previous != NULL){ /* search for the other index */ for(k = 0; k < ts->num_of_hidden; k++) if(nip_equal_variables(temp->previous, ts->hidden[k])) break; /* FIXME: Get rid of the quotient array */ printf("result[%d][%d][%d] / result[%d][%d][%d]\n", t+1, i, j, t, k, j); for(j = 0; j < NIP_CARDINALITY(temp); j++) quotient[i][j] = result[t + 1][i][j] / result[t][k][j]; nip_enter_evidence(model->variables, model->num_of_vars, model->cliques, model->num_of_cliques, temp->previous, quotient[i]); } } } /********************/ /* Do the inference */ /********************/ make_consistent(model); /*********************************/ /* Check the result of inference */ /*********************************/ for(i = 0; i < ts->num_of_hidden; i++){ /* 1. Decide which variable you are interested in */ interesting = ts->hidden[i]; /* 2. Find the clique that contains the family of * the interesting variable */ clique_of_interest = nip_find_family(model->cliques, model->num_of_cliques, interesting); if(!clique_of_interest){ free_model(model); free_timeseries(ts); printf("In hmmtest.c : No clique found! Sorry.\n"); return 1; } /* 3. Marginalisation (the memory must have been allocated) */ nip_marginalise_clique(clique_of_interest, interesting, result[t][i]); /* 4. Normalisation */ nip_normalise_array(result[t][i], NIP_CARDINALITY(interesting)); /* 5. Print the result */ for(j = 0; j < NIP_CARDINALITY(interesting); j++) printf("P(%s=%s) = %f\n", nip_variable_symbol(interesting), (interesting->state_names)[j], result[t][i][j]); printf("\n"); } /* forget old evidence */ reset_model(model); use_priors(model, NIP_HAD_A_PREVIOUS_TIMESLICE); } for(t = 0; t < TIME_SERIES_LENGTH(ts) + 1; t++){ for(i = 0; i < ts->num_of_hidden; i++) free(result[t][i]); free(result[t]); } for(i = 0; i < ts->num_of_hidden; i++) free(quotient[i]); free(result); free(quotient); for(i = 0; i < n; i++) free_timeseries(ts_set[i]); free(ts_set); free_model(model); return 0; }