我有一个非常基本的语法问题.我一直在学习d3,SVG和Javascript,主要是通过编辑别人的代码,这很有挑战性.
目标是在更新数据和基于数据的比例后更新y轴.我希望轴 - 刻度线和标签以及所有 - 转换为数据域.轴未更新.问题可能与范围有关,或者我引用了错误的SVG元素.(实际上有几个地块同时更新,但我只关注其中一个的轴.)
function makeYaxis (chart, scale, nticks, label, width, height, xmf, visName)
{
var yAxis = d3.svg.axis()
.scale(scale)
.orient("left")
.ticks(nticks);
chart.append("svg:g")
.attr("class","y axis")
.append("g")
.attr("transform","translate(60,1)") // fix magic #
.call(yAxis);
var xMove = xmf.yylMarginFactor * width - 1;
var yMove = (((1 - xmf.xxbMarginFactor) * height +
xmf.xxtMarginFactor * height) / 2);
chart.append("svg:text")
.attr("class", visName + "xLabel")
.attr("x", 0)
.attr("y", 0)
.attr("dy", "-2.8em")
.text(label)
.attr("transform", "rotate(-90) translate(-" + yMove + "," + xMove + ")");
} …Run Code Online (Sandbox Code Playgroud) 我正在编写一个基于代理的模拟,并且已经确定Boost的MultiIndex可能是我的代理最有效的容器.我不是一个专业的程序员,我的背景很不稳定.我有两个问题:
Host本身是否包含代理(类)是否更好,或容器容纳更高效Host *?主机有时会从内存中删除(这是我的计划,无论如何......需要阅读new并且delete).主机的私有变量会偶尔更新,我希望通过modifyMultiIndex中的函数来完成.模拟中不会有其他主机副本,即它们不会在任何其他容器中使用.// main.cpp - ATTEMPTED POINTER VERSION
...
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/tokenizer.hpp>
typedef multi_index_container<
Host *,
indexed_by<
// hash by Host::id
hashed_unique< BOOST_MULTI_INDEX_MEM_FUN(Host,int,Host::getID) > // arg errors here
> // end indexed_by
> HostContainer;
...
int main() {
...
HostContainer testHosts;
Host * newHostPtr;
newHostPtr = new Host( t, DOB, idCtr, 0, currentEvents );
testHosts.insert( newHostPtr );
...
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在模拟中使用Boost MultiIndex容器.我对C++语法的了解非常薄弱,我担心我没有正确地从容器中删除元素或从内存中删除它.我还需要修改元素,我也希望在此确认语法和基本哲学.
// main.cpp
...
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/tokenizer.hpp>
#include <boost/shared_ptr.hpp>
...
#include "Host.h" // class Host, all members private, using get fxns to access
using boost::multi_index_container;
using namespace boost::multi_index;
typedef multi_index_container<
boost::shared_ptr< Host >,
indexed_by<
hashed_unique< const_mem_fun<Host,int,&Host::getID> >
// ordered_non_unique< BOOST_MULTI_INDEX_MEM_FUN(Host,int,&Host::getAge) >
> // end indexed_by
> HostContainer;
typedef HostContainer::nth_index<0>::type HostsByID;
int main() {
...
HostContainer allHosts;
Host * newHostPtr;
newHostPtr = new Host( t, DOB, idCtr, 0, currentEvents );
allHosts.insert( …Run Code Online (Sandbox Code Playgroud) 我喜欢帮助诊断我尝试使用g ++ 4.2.1编译时收到的重复符号错误的来源.
具体错误是
ld: duplicate symbol _SOCIODEM_FILENAMES in /var/folders/c+/c+eq1Qz1Feye7vxs5mQOUE+++TI/-Tmp-//ccP3yVgF.o and /var/folders/c+/c+eq1Qz1Feye7vxs5mQOUE+++TI/-Tmp-//cc1NqtRL.o
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
只有在我将此声明包含在名为的文件中时才会发生错误Parameters.h:
// Parameters.h
#ifndef PARAMETERS_H
#define PARAMETERS_H
// ...[code snipped]...
const int NUM_SOCIODEM_FILES = 5;
const char * SOCIODEM_FILENAMES[ NUM_SOCIODEM_FILES ] = { "LSPAN_PDF.txt",
"FLEDGE_PDF.txt",
"PAIR_PDF.txt",
"BIRTH_AGE_PDF.txt",
"SPLIT_PDF.txt" };
// ...[code snipped]...
#endif
Run Code Online (Sandbox Code Playgroud)
我搜索了所有文件,这是唯一SOCIODEM_FILENAMES宣布的地方.当我注释掉声明时,"重复符号"错误消失了.
我不熟悉链接器错误(如果这就是这个),并希望帮助解决问题.我的所有头文件都有#ifndef...#define...#endif包装器.我的编译命令是
g++ -o a.out -I /Applications/boost_1_42_0/ Host.cpp Simulation.cpp main.cpp Rdraws.cpp
Run Code Online (Sandbox Code Playgroud)
提前致谢.
解决方案摘要
我现在在Parameters.h中:
const char * const SOCIODEM_FILENAMES[ NUM_SOCIODEM_FILES ] = { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用雪在R中运行并行作业.我已经能够在旧版本的R和雪上运行非常相似的工作.R包依赖性阻止我恢复.
会发生什么:我的工作在这一parRapply步骤终止,即第一次节点必须做任何报告之外的事情Sys.info().错误消息显示:
Error in checkForRemoteErrors(val) :
3 nodes produced errors; first error: cannot open the connection
Calls: parRapply ... clusterApply -> staticClusterApply -> checkForRemoteErrors
Run Code Online (Sandbox Code Playgroud)
规格: R 2.14.0,雪0.3-8,RedHat Enterprise Linux客户端版本5.6.雪包已经建立在正确版本的R上.
详细信息: 以下代码似乎执行正常:
cl <- makeCluster(3)
clusterEvalQ(cl,library(deSolve,lib="~/R/library"))
clusterCall(cl,function() Sys.info()[c("nodename","machine")])
Run Code Online (Sandbox Code Playgroud)
我是最终用户,而不是系统管理员,但我迫切需要建议并深入了解可能出现的问题.
即使在研究了这些例子之后,我也无法弄清楚如何使用MultiIndex容器上的复合键来提取范围.
typedef multi_index_container<
boost::shared_ptr< Host >,
indexed_by<
hashed_unique< const_mem_fun<Host,int,&Host::getID> >, // ID index
ordered_non_unique< const_mem_fun<Host,int,&Host::getAgeInY> >, // Age index
ordered_non_unique< const_mem_fun<Host,int,&Host::getHousehold> >, // Household index
ordered_non_unique< // Age & eligibility status index
composite_key<
Host,
const_mem_fun<Host,int,&Host::getAgeInY>,
const_mem_fun<Host,bool,&Host::isPaired>
>
>
> // end indexed_by
> HostContainer;
Run Code Online (Sandbox Code Playgroud)
我的目标是让一个迭代器指向HostContainer hmap具有age 的元素子集中的第一个partnerAge并返回false到Host::isPaired():
std::pair< hmap::iterator,hmap::iterator > pit = hmap.equal_range(boost::make_tuple( partnerAge, false ) );
Run Code Online (Sandbox Code Playgroud)
我认为这是非常错误的.
std::pair?(我正在从一个我不理解的例子中复制语法.)
std::count来计算的时代元素的数量partnerAge有资格(返回false到Host::isPaired() …我试图从R 调用一个程序(getNBDensitiesC可执行文件中measurementDensities_out的函数).该函数传递了几个数组和变量double runsum.现在,该getNBDensities函数基本上什么都不做:它打印以筛选传递参数的值.我的问题是调用函数的语法:
array(.C("getNBDensities",
hr = as.double(hosp.rate), # a vector (s x 1)
sp = as.double(samplingProbabilities), # another vector (s x 1)
odh = as.double(odh), # another vector (s x 1)
simCases = as.integer(x[c("xC1","xC2","xC3")]), # another vector (s x 1)
obsCases = as.integer(y[c("yC1","yC2","yC3")]), # another vector (s x 1)
runsum = as.double(runsum), # double
DUP = TRUE, NAOK = TRUE, PACKAGE = "measurementDensities_out")$f,
dim = length(y[c("yC1","yC2","yC3")]),
dimnames = c("yC1","yC2","yC3"))
正确执行该功能后(即右侧输出打印到屏幕),我得到的错误是
Error in …Run Code Online (Sandbox Code Playgroud) 我希望这属于这里,而不是数学论坛.
我试图在R中计算负二项式的密度.我的参数目前是mu(预期的平均失败次数)和过度离散参数的形式k.因为我正在调用已dnbinom编译的C代码,所以我需要将这些参数转换为默认参数化dnbinom,这需要每次试验成功的概率p和n计数停止前的成功次数.我用下面的公式来求解p,并n在以下方面mu和k:
n = mu*p/(1-p)
mu + mu^2/k = n(1-p)/p^2
Run Code Online (Sandbox Code Playgroud)
经过一些代数,我得到了
p = k/mu + 1
n = -(mu^2+k*mu)/k
Run Code Online (Sandbox Code Playgroud)
使用dnbinomR中的不同参数化检查这些方程式会发现一个问题:
> k = 1.2
> mu = 15
> p = k/mu+1
> n = -(mu*k+mu^2)/k
> dnbinom(10,size=n,prob=p)
[1] NaN
Warning message:
In dnbinom(x, size, prob, log) : NaNs produced
> dnbinom(10,mu=mu,size=k)
[1] 0.03560668
我错过了R的参数化怎么样?我现在很确定我的代数是正确的.或者,有没有办法在从C 调用时坚持原始参数化(就mu和而言k)dnbinom?
我是一个业余的C++程序员,试图了解基本的shell脚本.我有一个复杂的C++程序,当前从中读取不同的参数值Parameters.h,然后按顺序执行每个参数值的一个或多个模拟.这些模拟需要很长时间才能运行.由于我有一个可用的集群,我想有效地并行化这个作业,在一个单独的处理器上运行每个参数值的模拟.我假设为了这个目的,比OpenMPI更容易学习shell脚本技术.我的集群在LSF平台上运行.
如何在Bash中编写输入参数,以便它们分布在多个处理器中,每个处理器都使用该值执行程序?我想避免互动提交.理想情况下,我在Bash读取的文本文件中有输入,并且我将两个参数传递给每个作业:实际参数值和参数ID.
提前感谢任何线索和建议.
我的解决方案
GNU Parallel确实看起来很漂亮,但我最终(在IT管理员的帮助下)编写了一个简单的bash脚本来回显屏幕三个输入(治疗标识符,治疗/参数值和模拟标识符):
#!/bin/bash
j=1
for treatment in cat treatments.txt; do
for experiment in cat simulations.txt; do
bsub -oo tr_${j}_sim_${experiment}_screen -eo tr_${j}_sim_${experiment}_err -q short_serial "echo \"$j $treatment $experiment\" | ./a.out"
done
let j=$j+1
done
该文件treatments.txt包含我想要改变的值simulations.txt的列表,包含我想要运行的所有模拟标识符的列表(当前只有1,...,s,其中s是我想要的模拟总数每个治疗),以及处理被索引1 ... j.
我正在尝试将作业数组中的作业索引作为参数传递给另一个bash脚本.
numSims=3
numTreatments=6 # uses numTreatments top rows of parameters.csv
maxFail=10
j=1
while [ $j -le $numSims ];
do
bsub -q someQueue -J "mySim[1-$numTreatments]%2" ./another_script.sh $LSB_JOBINDEX $j $maxFail
let j=j+1
done
这里的最终想法是为1,... numTreatments,numSims作业(模拟)中的每一个提交.我想一次运行两个工作(%2).输出的格式为XX_indexNumber_simNumber,其中indexNumber从1开始运行,...,numTreatments以及从1开始的simNumber,...,numSims.
理想情况下,作为此脚本的一部分提交的所有内容都具有相同的作业ID.这尚未正确设置,因为具有相同作业的所有作业j都被分配了不同的作业ID.我的直接问题是another_script.sh没有识别$LSB_JOBINDEX为输入 - 它看到$j并且$maxFail作为第一个也是唯一两个传递的参数.当我用一些其他变量代替时$LSB_JOBINDEX,没有问题.我究竟做错了什么?
编辑 -有些事情我已经试过:"$LSB_JOBINDEX",${LSB_JOBINDEX},%I,和I=$LSB_JOBINDEX; bsub ... $I $j $maxFail
我在调试分段错误时遇到问题.我很欣赏如何缩小问题范围的提示.
迭代器尝试访问结构的元素时出现错误Infection,定义如下:
struct Infection {
public:
explicit Infection( double it, double rt ) : infT( it ), recT( rt ) {}
double infT; // infection start time
double recT; // scheduled recovery time
};
Run Code Online (Sandbox Code Playgroud)
这些结构保存在一个特殊的结构中,InfectionMap:
typedef boost::unordered_multimap< int, Infection > InfectionMap;
Run Code Online (Sandbox Code Playgroud)
班上的每个成员Host都有InfectionMap carriage.恢复时间和关联的主机标识符保存在优先级队列中.当s在特定主机中的特定应变的模拟中出现预定的恢复事件时,程序搜索carriage该主机以找到与恢复时间()匹配的Infection那些.(对于那些不值得进入的原因,它不是作为权宜之计,我使用为重点,以;应变更为有用的,一脉相承合并感染是可能的.)recTdouble recoverTimerecTInfectionMaps
assert( carriage.size() > 0 );
pair<InfectionMap::iterator,InfectionMap::iterator> ret = carriage.equal_range( s );
InfectionMap::iterator it;
for ( it = …Run Code Online (Sandbox Code Playgroud) 我对编译器错误很困惑.我的代码在4-5小时前完成了工作; 沿途唯一可行的检查点没有产生任何线索(即,我无法让错误在一个中间步骤消失).我没有看到编译器错误如何与我所做的任何更改有关.
用.编译
g++ -O3 -o a.out -I /Applications/boost_1_42_0/ Host.cpp Simulation.cpp main.cpp Rdraws.cpp SimPars.cpp
出现以下错误
Undefined symbols:
"Simulation::runTestEpidSim()", referenced from:
_main in ccmcSY5M.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我在中创建和操作Simulation对象main.我对代码的唯一更改是(1)创建一个新的成员函数,Simulation::runTestEpidSim()它被调用main,以及(2)编写一些新的全局输入/输出处理函数,我已经将其解包并直接插入到main顺序中调试正在发生的事情.
我没有更改任何cpp文件,包括头文件,库或编译器命令.
我不是一个专业的程序员.专业人士将如何调试此类问题?
不确定如何最好地剪切和粘贴我的代码,但这里是摘录 -
class Simulation
{
public:
Simulation( int trt, int sid, SimPars * spPtr );
~Simulation();
// MEMBER FUNCTION PROTOTYPES
void runDemSim( void );
void runEpidSim( void );
double runTestEpidSim( void );
...
} …Run Code Online (Sandbox Code Playgroud)