コード例 #1
0
ファイル: sem.c プロジェクト: Andlon/cs267FinalProject
static SAMPLE_VGM *cross_covariogram(DATA *a, DATA *b, SAMPLE_VGM *ev) {
	int i, j, index = 0;
	unsigned long uli, ulj;
	double gamma, ddist;

	ev->evt = CROSSCOVARIOGRAM;
	ev = alloc_exp_variogram(a, b, ev);
	for (i = 0; i < a->n_list; i++) {      /* i -> a */
		for (j = 0; j < b->n_list; j++) {  /* j -> b */
			ddist = valid_distance(a->list[i], b->list[j], ev->cutoff,
				gl_sym_ev, a, b, (GRIDMAP *) ev->map); 
			if (ddist >= 0.0) {
				if (! ev->cloud) {
					index = get_index(ddist, ev);
					ev->gamma[index] += a->list[i]->attr * b->list[j]->attr;
					ev->dist[index] += ddist;
					ev->pairs[index] = register_pairs(ev->pairs[index],
						ev->nh[index], a->list[i], b->list[j]);
					ev->nh[index]++;
				} else if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) {
					gamma = a->list[i]->attr * b->list[j]->attr;
					uli = i; 
					ulj = j;
					push_to_cloud(ev, gamma, ddist, TO_NH(uli,ulj));
				}
			}/* if ddist >= 0 */
		}  /* for j */
	} /* for i */
	divide(ev);
	ev->recalc = 0;
	return ev;
} /* cross_covariogram() */
コード例 #2
0
ファイル: sem.c プロジェクト: Andlon/cs267FinalProject
/* covariograms: */
static SAMPLE_VGM *covariogram(DATA *d, SAMPLE_VGM *ev) {
	int i, j, index = 0;
	unsigned long uli, ulj;
	double gamma, ddist;

	ev->evt = COVARIOGRAM;
	ev = alloc_exp_variogram(d, NULL, ev);
	for (i = 0; i < d->n_list; i++) {
		for (j = 0; j <= (ev->map != NULL ? d->n_list-1 : i); j++) {
			ddist = valid_distance(d->list[i], d->list[j], ev->cutoff, 1,
				d, d, (GRIDMAP *) ev->map);
			if (ddist >= 0.0) {
				if (! ev->cloud) {
					index = get_index(ddist, ev);
					ev->gamma[index] += d->list[i]->attr * d->list[j]->attr;
#ifdef ADJUST_VARIANCE
					if (d->colnvariance && i == j)
						ev->gamma[index] -= d->list[i]->variance;
#endif
					ev->dist[index] += ddist;
					ev->pairs[index] = register_pairs(ev->pairs[index],
						ev->nh[index], d->list[i], d->list[j]);
					ev->nh[index]++;
				} else {
					if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) {
						gamma = d->list[i]->attr * d->list[j]->attr;
#ifdef ADJUST_VARIANCE
						if (d->colnvariance && i == j)
							gamma -= d->list[i]->variance;
#endif
						uli = i;
						ulj = j;
						push_to_cloud(ev, gamma, ddist, TO_NH(uli,ulj));
					}
				}
			}/* if ddist >= 0 */
		}  /* for j */
	} /* for i */
	divide(ev);
	ev->recalc = 0;
	return ev;
} /* covariogram() */
コード例 #3
0
ファイル: sem.c プロジェクト: Andlon/cs267FinalProject
static SAMPLE_VGM *cross_variogram(DATA *a, DATA *b, SAMPLE_VGM *ev) {
	int i, j, index = 0;
	unsigned long uli, ulj;
	double gamma, ddist;

	ev->evt = CROSSVARIOGRAM;
	ev = alloc_exp_variogram(a, b, ev);
	for (i = 0; i < a->n_list; i++) {
		for (j = 0; j < b->n_list; j++) {
			ddist = valid_distance(a->list[i], b->list[j], ev->cutoff,
				gl_sym_ev || !ev->pseudo, a, b, (GRIDMAP *) ev->map); 
			if (ddist >= 0.0) {
				if (!ev->pseudo && i != j) {
					if (! ev->cloud) {
						index = get_index(ddist, ev);
						ev->gamma[index] += 
							(a->list[i]->attr - a->list[j]->attr) *
							(b->list[i]->attr - b->list[j]->attr);
						ev->dist[index] += ddist;
						ev->pairs[index] = register_pairs(ev->pairs[index],
							ev->nh[index], a->list[i], a->list[j]);
						ev->nh[index]++;
					} else if (!(ddist == 0.0 && ev->zero == ZERO_AVOID)) { 
						gamma = (a->list[i]->attr - a->list[j]->attr) *
							(b->list[i]->attr - b->list[j]->attr);
						uli = i; 
						ulj = j;
						push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj));
					}
				} else if (ev->pseudo) {
					if (! ev->cloud) {
						index = get_index(ddist, ev);
						ev->gamma[index] += 
							SQR(a->list[i]->attr - b->list[j]->attr);
#ifdef ADJUST_VARIANCE
						if (a->colnvariance || b->colnvariance)
							ev->gamma[index] -= a->list[i]->variance +
								 b->list[j]->variance;
#endif
						ev->dist[index] += ddist;
						ev->pairs[index] = register_pairs(ev->pairs[index],
							ev->nh[index], a->list[i], b->list[j]);
						ev->nh[index]++;
					} else if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) {
						gamma = SQR(a->list[i]->attr - b->list[j]->attr);
#ifdef ADJUST_VARIANCE
						if (a->colnvariance || b->colnvariance)
							gamma -= a->list[i]->variance + b->list[j]->variance;
#endif
						uli = i;
						ulj = j;
						push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj));
					}
				}
			}/* if ddist >= 0 */
		}  /* for j */
	} /* for i */
	divide(ev);
	ev->recalc = 0;
	return ev;
} /* cross_variogram */
コード例 #4
0
ファイル: sem.c プロジェクト: Andlon/cs267FinalProject
static SAMPLE_VGM *semivariogram_grid(DATA *d, SAMPLE_VGM *ev) {

	typedef struct {
		int row, col, ev_index;
		double dist;
	} grid_index;
	struct {
		int n;
		grid_index *gi;
	} grid_ev;
	int row, col, irow, icol, i, max_index, index;
	unsigned long ula, ulb;
	double gamma, ddist;
	DPOINT a, b, *dpa = NULL, *dpb = NULL;

	max_index = floor(ev->cutoff / SQUARECELLSIZE(d->grid));
	grid_ev.gi = (grid_index *) emalloc(2 * (max_index + 1) * (max_index + 1)
		* sizeof(grid_index));
	grid_ev.n = 0;
	a.x = a.y = a.z = 0;
	/* setup the grid: */
	for (row = 0; row <= max_index; row++) {
		for (col = (row == 0 ? 1 : -max_index); col <= max_index; col++) {
			b.x = col * SQUARECELLSIZE(d->grid);
			b.y = row * SQUARECELLSIZE(d->grid);
			ddist = valid_distance(&a, &b, ev->cutoff, 1,
				d, d, (GRIDMAP *) ev->map);
			if (ddist > 0.0) {
				grid_ev.gi[grid_ev.n].row = row;
				grid_ev.gi[grid_ev.n].col = col;
				grid_ev.gi[grid_ev.n].dist = ddist;
				if (! ev->cloud)
					grid_ev.gi[grid_ev.n].ev_index = get_index(ddist, ev);
				if (DEBUG_DUMP)
					printlog("row %d col %d index %d\n", 
						row, col, grid_ev.gi[grid_ev.n].ev_index);
				grid_ev.n++;
			}
		}
	}
	print_progress(0, d->grid->rows);
	for (row = 0; row < d->grid->rows; row++) {
		for (col = 0; col < d->grid->cols; col++) {
			if ((dpa = d->grid->dpt[row][col]) != NULL) {
				for (i = 0; i < grid_ev.n; i++) {
					irow = row + grid_ev.gi[i].row;
					icol = col + grid_ev.gi[i].col;
					if (irow >= 0 && icol >= 0 && irow < d->grid->rows
							&& icol < d->grid->cols
							&& ((dpb = d->grid->dpt[irow][icol]) != NULL)) {
						ddist = grid_ev.gi[i].dist;
						if (! ev->cloud) {
							index = grid_ev.gi[i].ev_index;
							if (gl_cressie)  /* sqrt abs diff */
								ev->gamma[index] +=
									sqrt(fabs(dpa->attr - dpb->attr));
							else {
								ev->gamma[index] += SQR(dpa->attr - dpb->attr);
#ifdef ADJUST_VARIANCE
								if (d->colnvariance)
									ev->gamma[index] -= dpa->variance +
										 	dpb->variance;
#endif
							}
							ev->dist[index] += ddist;
							ev->pairs[index] = register_pairs(ev->pairs[index],
								ev->nh[index], dpa, dpb);
							ev->nh[index]++;
						} else { /* cloud: */
							if (gl_cressie)
								gamma = sqrt(fabs(dpa->attr - dpb->attr));
							else
								gamma = SQR(dpa->attr - dpb->attr);
#ifdef ADJUST_VARIANCE
							if (d->colnvariance)
								gamma -= dpa->variance + dpb->variance;
#endif
							ula = GET_INDEX(dpa);
							ulb = GET_INDEX(dpb);
							push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(ula,ulb));
						} /* else !cloud */
					} /* if we have two non-NULL points */
				} /* for all possibly relevant pairs */
			} /* if this grid cell is non-NULL */
		} /* for all cols */
		print_progress(row + 1, d->grid->rows);
	} /* for all rows */
	efree(grid_ev.gi);
	return ev;
}
コード例 #5
0
ファイル: sem.c プロジェクト: Andlon/cs267FinalProject
static SAMPLE_VGM *semivariogram_list(DATA *d, SAMPLE_VGM *ev) {
	unsigned long uli, ulj;
	int i, j, index = 0, divide_by = 1;
	unsigned int total_steps;
	double gamma, ddist;

	while (d->n_sel / divide_by > sqrt(INT_MAX))
		divide_by <<= 1; /* prevent overflow on calculating total_steps */

	total_steps = (d->n_sel / divide_by) * (d->n_sel - 1) / 2;
	print_progress(0, total_steps);

	if (DEBUG_DUMP)
		printlog("Calculating semivariogram from %d points...\n", d->n_sel);

	for (i = 0; i < d->n_sel; i++) {
		print_progress((i / divide_by) * (i - 1) / 2, total_steps);
		/*
		printlog("step: %u of %u\n", (i /divide_by) * (i - 1) / 2, total_steps);
		*/
		for (j = 0; j < (ev->map != NULL ? d->n_sel : i); j++) {
			ddist = valid_distance(d->sel[i], d->sel[j], ev->cutoff, 1,
				d, d, (GRIDMAP *) ev->map);
			if (ddist >= 0.0 && i != j) {
				if (! ev->cloud) {
					index = get_index(ddist, ev);
					if (gl_cressie)  /* sqrt abs diff */
						ev->gamma[index] +=
							sqrt(fabs(d->sel[i]->attr - d->sel[j]->attr));
					else {
						ev->gamma[index] +=
							SQR(d->sel[i]->attr - d->sel[j]->attr);
#ifdef ADJUST_VARIANCE
						if (d->colnvariance)
							ev->gamma[index] -= d->sel[i]->variance +
									 d->sel[j]->variance;
#endif
					}
					ev->dist[index] += ddist;
					if (d->sel == d->list)
						ev->pairs[index] = register_pairs(ev->pairs[index],
							ev->nh[index], d->sel[i], d->sel[j]);
					ev->nh[index]++;
				} else { /* cloud: */
					if (! (ev->zero == ZERO_AVOID && ddist == 0.0)) {
						if (gl_cressie)
							gamma = sqrt(fabs(d->sel[i]->attr - d->sel[j]->attr));
						else
							gamma = SQR(d->sel[i]->attr - d->sel[j]->attr);
#ifdef ADJUST_VARIANCE
						if (d->colnvariance)
							gamma -= d->sel[i]->variance + d->sel[j]->variance;
#endif
						uli = i; ulj = j;
						push_to_cloud(ev, gamma / 2.0, ddist, TO_NH(uli,ulj));
					}
				}
			}/* if ddist >= 0 */
		}  /* for j */
	} /* for i */
	print_progress(total_steps, total_steps);
	if (DEBUG_DUMP)
		printlog("ready\n");
	return ev;
}
コード例 #6
0
ファイル: clientAdmin.c プロジェクト: yanlunyao/gateway
/***************************************************************************
  Function: modify_alias
  Description: read old alias and check, write new alias to alias.conf & push to cloud server
  Input: cgi_result, the return value of cgiFormString
            old_alias_str, null terminated, not check yet
            new_alias_str, null terminated, already check
  Output: 
  Return: 0 OK, other Error
  Others:  none
***************************************************************************/
int modify_alias(cgiFormResultType cgi_result, const char * old_alias_str, const char * new_alias_str)
{
    int fd_alias;
	char gateway_alias[FEATURE_GDGL_ACCOUNT_MAX_LEN + 1];
	int res;
	int len, tries = 5;
	int mqid;
	struct client_admin_msgbuf mesg;

    fd_alias = open(FEATURE_GDGL_ALIAS_PATH, O_RDWR, 0777);
	if (fd_alias < 0) {
		return clientAdminAliasFileOpenErr;
	}
	res = write_lock(fd_alias, 0, SEEK_SET, 0);
	if (res == -1) {
		close(fd_alias);
		return clientAdminAliasFileLockErr;
	}
	// Read old alias
	res = read(fd_alias, gateway_alias, FEATURE_GDGL_ACCOUNT_MAX_LEN);
	if (res < 0) {
		close(fd_alias);
		return clientAdminAliasFileReadErr;
	}
	gateway_alias[res] = '\0';
	//add yanly150625
	if((gateway_alias[res-1] == 0x0a)||(gateway_alias[res-1] == 0x0d)) {  //如果最后一个字符等于换行符号或者回车键,就换成结束符
		gateway_alias[res-1] = '\0';
	}
    // Check old alias
	res = check_alias(cgi_result, old_alias_str, gateway_alias);
	if (res != 0) {
		close(fd_alias);
		return res;
	}
	// Check if old == new
	if (strcmp(old_alias_str, new_alias_str) == 0) {
		close(fd_alias);
		return clientAdminTwoAliasEqualErr;
	}

	// Push to cloud
	//if push failed, return push error
	if ( (res = push_to_cloud(modifyAliasType, "modifyalias", old_alias_str, new_alias_str)) < 0 ) {
		close(fd_alias);
		return clientAdminPushToCloudErr;
	}
	else if (res > 0) {
		close(fd_alias);
		return res;
	}

	// Write new alias
	len = strlen(new_alias_str);
	while (tries > 0) {
		// seek to beginning of file
		res = lseek(fd_alias, 0, SEEK_SET);
		if (res < 0) {
		    close(fd_alias);
		    return clientAdminAliasFileSeekErr;
	    }
		// truncate the file to 0 byte
	    res = ftruncate(fd_alias, 0);
	    if (res < 0) {
		    close(fd_alias);
		    return clientAdminAliasFileTruncErr;
	    }
	    res = writen(fd_alias, new_alias_str, len);
	    if (res != len) {
			tries--;
	    }
		else {
			break;
		}
	}
	if (tries == 0) {
	    close(fd_alias);
		return clientAdminAliasFileWriteErr;
	}

	close(fd_alias); //also unlock

	// Send IPC msg
	mqid = msgget(CLIENTADMIN_MQ_KEY, 0);
	if (mqid == -1) {
		CA_DEBUG("msgget error %d:%s\n", mqid, strerror(errno));
	}
	else {
		len = construct_msg(clientAdmintMsgAlias, new_alias_str, &mesg);
		if (len > 0) {
			res = msgsnd(mqid, &mesg, len, 0);
			if (res == -1) {
				CA_DEBUG("msgsnd error %s\n", strerror(errno));
			}
		}
	}
	return 0;
}
コード例 #7
0
ファイル: clientAdmin.c プロジェクト: yanlunyao/gateway
/***************************************************************************
  Function: modify_password
  Description: read old password and check, write new password to password.conf & push to cloud server
  Input: cgi_result, the return value of cgiFormString
            old_passwd_str, null terminated, not check yet
            new_passwd_str, null terminated, already check
  Output: 
  Return: 0 OK, other Error
  Others:  none
***************************************************************************/
int modify_password(cgiFormResultType cgi_result, const char * old_passwd_str, const char * new_passwd_str)
{
    int fd_passwd;
	char gateway_passwd[FEATURE_GDGL_PASSWD_MAX_LEN + 1];
	int res;
	int len, tries = 5;
	int mqid;
	struct client_admin_msgbuf mesg;

    fd_passwd = open(FEATURE_GDGL_PASSWD_PATH, O_RDWR, 0777);
	if (fd_passwd < 0) {
		return clientAdminPasswdFileOpenErr;
	}
	res = write_lock(fd_passwd, 0, SEEK_SET, 0);
	if (res == -1) {
		close(fd_passwd);
		return clientAdminPasswdFileLockErr;
	}
	// Read old password
	res = read(fd_passwd, gateway_passwd, FEATURE_GDGL_PASSWD_MAX_LEN);
	if (res < 0) {
		close(fd_passwd);
		return clientAdminPasswdFileReadErr;
	}
	gateway_passwd[res] = '\0';
	if((gateway_passwd[res-1] == 0x0a)||(gateway_passwd[res-1] == 0x0d)) {  //如果最后一个字符等于换行符号或者回车键
		gateway_passwd[res-1] = '\0';
	}
    // Check old password
	res = check_password(cgi_result, old_passwd_str, gateway_passwd);
	if (res != 0) {
		close(fd_passwd);
		return res;
	}
	// Check if old == new
	if (strcmp(old_passwd_str, new_passwd_str) == 0) {
		close(fd_passwd);
		return clientAdminTwoPasswdEqualErr;
	}
		
	// Push to cloud
	//if push failed, return push error
	if ( (res = push_to_cloud(modifyPasswordType, "modifypassword", old_passwd_str, new_passwd_str)) < 0 ) {
		close(fd_passwd);
		return clientAdminPushToCloudErr;
	}
	else if (res > 0) {
		close(fd_passwd);
		return res;
	}  //debug yan
	
	// Write new password
	len = strlen(new_passwd_str);
	while (tries > 0) {
		// seek to beginning of file
		res = lseek(fd_passwd, 0, SEEK_SET);
		if (res < 0) {
		    close(fd_passwd);
		    return clientAdminPasswdFileSeekErr;
	    }
		// truncate the file to 0 byte
	    res = ftruncate(fd_passwd, 0);
	    if (res < 0) {
		    close(fd_passwd);
		    return clientAdminPasswdFileTruncErr;
	    }
	    res = writen(fd_passwd, new_passwd_str, len);
	    if (res != len) {
			tries--;		    
	    }
		else {
			break;
		}
	}
	// ����ظ���Ȼʧ�ܣ���ʱ�����ϴ洢����Ϣ������ģ�Ӧ����ô����????
	if (tries == 0) {
	    close(fd_passwd);
		return clientAdminPasswdFileWriteErr;
	}
	
	close(fd_passwd); //also unlock

	// Send IPC msg
	mqid = msgget(CLIENTADMIN_MQ_KEY, 0);
	if (mqid == -1) {
		CA_DEBUG("msgget error %d:%s\n", mqid, strerror(errno));
	}
	else {
		len = construct_msg(clientAdmintMsgPassword, new_passwd_str, &mesg);
		if (len > 0) {
			res = msgsnd(mqid, &mesg, len, 0);
			if (res == -1) {
				CA_DEBUG("msgsnd error %s\n", strerror(errno));
			}
		}		
	}
	return 0;
}