Возврат нескольких значений отдельно от расширения Netlo go - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь вернуть два значения из разделимости расширения Netlo go. В приведенном ниже коде расширения:

package distribution;
import java.util.Random;

import org.nlogo.api.*;

public class V2G extends DefaultReporter {
    
    public Syntax getSyntax() {
        return Syntax.reporterSyntax(new int[] {Syntax.ListType(), Syntax.NumberType(), Syntax.NumberType(), Syntax.NumberType(), Syntax.NumberType()}, Syntax.ListType());
    }
    
    public Object report(Argument args[], Context context) throws ExtensionException {
        
        
        LogoList coalizao;
        double gamma; 
        double amdc;
        double op;
        int constante;
        
        
        double mep=0;
        double sum = 0;
        
        
        try {
            coalizao =  args[0].getList();
            gamma =     args[1].getDoubleValue();
            amdc =      args[2].getDoubleValue();
            constante = args[3].getIntValue();
            op =        args[4].getDoubleValue();
            
        }
        catch(LogoException e) {
            throw new ExtensionException( e.getMessage() ) ;
        }
        
         
        if (coalizao.size() < 2 || coalizao.size() > gamma) return 0;
        
        
        
            for (int i = 0; i < coalizao.size(); i++) {
                
            int agente = (int)((Double)coalizao.get(i)).doubleValue();
            
            int min = 0;
            int max = 30;

            Random r = new Random(agente*constante);
            mep += r.nextInt(max - min + 1) + min;
            return mep;
        }
        
    sum = amdc + mep - op ;
    return sum; 
    
    }
    } 

В приведенном выше коде есть два значения, которые должны возвращать mep и sum.

Я использую следующий код в Netlo go для импорта values ​​

to-report getCoalitionValue [coalition]
report distribution:V2G coalition gamma amdc constante op
end

Теперь моя проблема в том, как я могу импортировать значения mep и sum отдельно в Netlo go.

Кто-нибудь может мне помочь с этим? Заранее спасибо.

1 Ответ

2 голосов
/ 13 июля 2020

NetLo go на самом деле не имеет концепции возврата нескольких значений из примитива. Самый лучший способ NetLo go -i sh сделать это - вернуть список значений в стандартном порядке.

Вот некоторый Scala код для sh этого. Пользователи этого примитива в NetLo go должны знать, что нужно сделать item 0 sample-scala:two-values, чтобы получить "apples", и item 1 sample-scala:two-values, чтобы получить 0.

object TwoValues extends api.Reporter {

  override def getSyntax = reporterSyntax(ret = ListType)

  def report(args: Array[api.Argument], context: api.Context): AnyRef = {
    import org.nlogo.api.ScalaConversions.toLogoList

    Seq( "apples", 0 ).toLogoList // returns the NetLogo list ["apples", 0]
  }
}

Я вижу, вы пишете Java code, поэтому хорошей ссылкой для создания списка NetLo go с использованием LogoListBuilder будет пример кода расширения Java :

  public Object report(Argument args[], Context context)
      throws ExtensionException {
    // create a NetLogo list for the result
    LogoListBuilder list = new LogoListBuilder();

    int n;
    // use typesafe helper method from
    // org.nlogo.api.Argument to access argument
    try {
      n = args[0].getIntValue();
    } catch (LogoException e) {
      throw new ExtensionException(e.getMessage());
    }

    if (n < 0) {
      // signals a NetLogo runtime error to the modeler
      throw new ExtensionException
          ("input must be positive");
    }

    // populate the list
    // note that we use Double objects; NetLogo numbers
    // are always doubles
    for (int i = 0; i < n; i++) {
      list.add(Double.valueOf(i));
    }
    return list.toLogoList();
  }
...