crowdwalk/src/main/java/nodagumi/ananPJ/Agents/Factory/AgentFactoryList.java
/**
     * scan one line of CSV file
     */
scan one line of CSV file
scan one line of CSV file
private AgentFactoryConfig scanCsvFileOneLine(String line,
                                                  NetworkMap map,
                                                  int ruleCount)
        throws IOException
    {
        if (line.startsWith("#")) return null ;
        if (line.startsWith(",")) return null ;
        ShiftingStringList columns =
            ShiftingStringList.newFromCsvRow(line) ;
        if(fileFormat == FileFormat.Ver1) {
            if (columns.length() < 7 && columns.length() != 4) {
                Itk.logWarn("malformed line", line);
                return null ;
            }
        } else {
            if (columns.length() < 5 && columns.length() != 2) {
                Itk.logWarn("malformed line", line);
                return null ;
            }
        }
        /* [2014.12.20 I.Noda] should obsolete
         * ruleType が指定されないことがあるのか？
         * これは、特に CSV の場合、致命的なバグの原因となる。
         */
        RuleType ruleType = (RuleType)ruleLexicon.lookUp(columns.top()) ;
        if (ruleType == null)
            ruleType = RuleType.EACH ;
        else
            columns.shift() ;
        if (ruleType == RuleType.LINER_GENERATE_AGENT_RATIO) {
            double lga_ratio = 0;
            lga_ratio = Double.parseDouble(columns.get()) ;
            if (lga_ratio > 0)
                liner_generate_agent_ratio = lga_ratio;
            return null ;
        }
        AgentFactoryConfig factoryConfig = newConfigByRuleType(ruleType) ;
        factoryConfig.originalInfo = line ;
        factoryConfig.ruleName = ("" + ruleCount) ;
        /* [I.Noda] Ver1 以降は、ruleType の直後はエージェントクラス名 */
        if(fileFormat == FileFormat.Ver1) {
            factoryConfig.agentClassName = columns.nth(0) ;
            factoryConfig.agentConf = Term.newByJson(columns.nth(1)) ;
            columns.shift(2) ;
        } else {
            /* [2014.12.29 I.Noda]
             * agentClassName を埋めておかないと、directive の処理が出来ない。
             * なので、AgentFactory に指定する規定値を埋める。
             */
            factoryConfig.agentClassName = AgentFactory.DefaultAgentClassName ;
        }
        if(! scanStartLinkTag(Itk.intern(columns.get()), map, factoryConfig))
            return null ;
        try {
            factoryConfig.startTime = new SimTime(columns.get()) ;
        } catch(Exception ex) {
            return null ;
        }
        if (ruleType == RuleType.TIMEEVERY) {
            try {
                ((AgentFactoryConfig_TimeEvery)factoryConfig).everyEndTime =
                    new SimTime(columns.get()) ;
            } catch(Exception ex) {
                return null ;
            }
            ((AgentFactoryConfig_TimeEvery)factoryConfig).everySeconds =
                Integer.parseInt(columns.get()) ;
        }
        factoryConfig.duration = Double.parseDouble(columns.get()) ;
        factoryConfig.total = Integer.parseInt(columns.get());
        if (liner_generate_agent_ratio != 1) {
            Itk.logInfo("use liner_generate_agent_ratio",
                        "factoryConfig.total:", factoryConfig.total,
                        "ratio:", liner_generate_agent_ratio);
            factoryConfig.total =
                (int)(factoryConfig.total * liner_generate_agent_ratio);
        }
        /* [2014.12.20 I.Noda] should obsolete
         * speed_model を指定しないことはあるのか？
         * 少なくとも CSV で指定する場合、
         * 混乱の原因以外の何物でもない
         * 一番問題なのは、speed_model に相当するタグでなければ、
         * columns を shift しないところ。
         */
        factoryConfig.speedModel =
            (SpeedCalculationModel)speedModelLexicon.lookUp(columns.top()) ;
        if(factoryConfig.speedModel == null) {
            factoryConfig.speedModel = getFallbackSpeedModel() ;
        } else {
            columns.shift() ;
        }
        if (factoryConfig.ruleType == RuleType.EACHRANDOM) {
            ((AgentFactoryConfig_EachRandom)factoryConfig).maxFromEachPlace =
                Integer.parseInt(columns.get()) ;
        }
        factoryConfig.goal = new Term(columns.top(), true) ;
        if(!scanRestColumns(columns, map, factoryConfig))
            return null ;
        return factoryConfig ;
    }
private AgentFactoryConfig scanCsvFileOneLine ( String line , NetworkMap map , int ruleCount ) throws IOException { if ( line . startsWith ( "#" ) ) return null ; if ( line . startsWith ( "," ) ) return null ; ShiftingStringList columns = ShiftingStringList . newFromCsvRow ( line ) ; if ( fileFormat == FileFormat . Ver1 ) { if ( columns . length ( ) < 7 && columns . length ( ) != 4 ) { Itk . logWarn ( "malformed line" , line ) ; return null ; } } else { if ( columns . length ( ) < 5 && columns . length ( ) != 2 ) { Itk . logWarn ( "malformed line" , line ) ; return null ; } } /* [2014.12.20 I.Noda] should obsolete
         * ruleType が指定されないことがあるのか？
         * これは、特に CSV の場合、致命的なバグの原因となる。
         */ RuleType ruleType = ( RuleType ) ruleLexicon . lookUp ( columns . top ( ) ) ; if ( ruleType == null ) ruleType = RuleType . EACH ; else columns . shift ( ) ; if ( ruleType == RuleType . LINER_GENERATE_AGENT_RATIO ) { double lga_ratio = 0 ; lga_ratio = Double . parseDouble ( columns . get ( ) ) ; if ( lga_ratio > 0 ) liner_generate_agent_ratio = lga_ratio ; return null ; } AgentFactoryConfig factoryConfig = newConfigByRuleType ( ruleType ) ; factoryConfig . originalInfo = line ; factoryConfig . ruleName = ( "" + ruleCount ) ; /* [I.Noda] Ver1 以降は、ruleType の直後はエージェントクラス名 */ if ( fileFormat == FileFormat . Ver1 ) { factoryConfig . agentClassName = columns . nth ( 0 ) ; factoryConfig . agentConf = Term . newByJson ( columns . nth ( 1 ) ) ; columns . shift ( 2 ) ; } else { /* [2014.12.29 I.Noda]
             * agentClassName を埋めておかないと、directive の処理が出来ない。
             * なので、AgentFactory に指定する規定値を埋める。
             */ factoryConfig . agentClassName = AgentFactory . DefaultAgentClassName ; } if ( ! scanStartLinkTag ( Itk . intern ( columns . get ( ) ) , map , factoryConfig ) ) return null ; try { factoryConfig . startTime = new SimTime ( columns . get ( ) ) ; } catch ( Exception ex ) { return null ; } if ( ruleType == RuleType . TIMEEVERY ) { try { ( ( AgentFactoryConfig_TimeEvery ) factoryConfig ) . everyEndTime = new SimTime ( columns . get ( ) ) ; } catch ( Exception ex ) { return null ; } ( ( AgentFactoryConfig_TimeEvery ) factoryConfig ) . everySeconds = Integer . parseInt ( columns . get ( ) ) ; } factoryConfig . duration = Double . parseDouble ( columns . get ( ) ) ; factoryConfig . total = Integer . parseInt ( columns . get ( ) ) ; if ( liner_generate_agent_ratio != 1 ) { Itk . logInfo ( "use liner_generate_agent_ratio" , "factoryConfig.total:" , factoryConfig . total , "ratio:" , liner_generate_agent_ratio ) ; factoryConfig . total = ( int ) ( factoryConfig . total * liner_generate_agent_ratio ) ; } /* [2014.12.20 I.Noda] should obsolete
         * speed_model を指定しないことはあるのか？
         * 少なくとも CSV で指定する場合、
         * 混乱の原因以外の何物でもない
         * 一番問題なのは、speed_model に相当するタグでなければ、
         * columns を shift しないところ。
         */ factoryConfig . speedModel = ( SpeedCalculationModel ) speedModelLexicon . lookUp ( columns . top ( ) ) ; if ( factoryConfig . speedModel == null ) { factoryConfig . speedModel = getFallbackSpeedModel ( ) ; } else { columns . shift ( ) ; } if ( factoryConfig . ruleType == RuleType . EACHRANDOM ) { ( ( AgentFactoryConfig_EachRandom ) factoryConfig ) . maxFromEachPlace = Integer . parseInt ( columns . get ( ) ) ; } factoryConfig . goal = new Term ( columns . top ( ) , true ) ; if ( ! scanRestColumns ( columns , map , factoryConfig ) ) return null ; return factoryConfig ; }
scan one line of CSV file
scan one line of CSV file
//コメント行読み飛ばし // カラムに分割 // [2014/12/15 I.Noda] // CSV Parser を使うように変更。 // さらに、ShiftingColumns を使うよにする。 //String items[] = line.split(","); //String items[] = csvParser.parseLine(line) ; //int index = 0; // 行の長さチェック // check rule strings // if no rule tag, default tag "EACH" is applied. // LINER_GENERATE_AGENT_RATIO の場合、 // lga_ratio が次に来る。 // で、読み込んだら次の行。（エージェント生成しない） // 生成条件の格納用データ // 生成の設定情報を以下にまとめて保持。 // 生成ルールの名前。CSVの場合は、順序の番号の文字列。 // read start link // もし start link の解析に失敗したら、次の行へ。 // 出発時刻 // TIMEEVERYの場合は、出発時刻間隔 // duration // total number of generated agents // speed model // EACHRANDOM // goal を scan // ゴールより後ろの読み取り。