Przeglądaj źródła

лажа какая-то

kpmy 8 lat temu
rodzic
commit
2b84d8ca38

+ 66 - 0
pom.xml

@@ -11,6 +11,7 @@
 
     <properties>
         <java.version>1.8</java.version>
+        <querydsl.version>4.1.4</querydsl.version>
     </properties>
 
     <parent>
@@ -44,7 +45,48 @@
             <version>0.7.7</version>
             <classifier>jdk8</classifier>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mapdb</groupId>
+            <artifactId>mapdb</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-collections</artifactId>
+            <version>${querydsl.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.querydsl</groupId>
+            <artifactId>querydsl-apt</artifactId>
+            <version>${querydsl.version}</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.uncommons.maths/uncommons-maths -->
+        <dependency>
+            <groupId>org.uncommons.maths</groupId>
+            <artifactId>uncommons-maths</artifactId>
+            <version>1.2.2</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math3</artifactId>
+            <version>3.6.1</version>
+        </dependency>
+
     </dependencies>
+
     <build>
         <finalName>dialij</finalName>
         <plugins>
@@ -79,6 +121,30 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>com.mysema.maven</groupId>
+                <artifactId>apt-maven-plugin</artifactId>
+                <version>1.1.3</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.basedir}/target/generated-sources/java</outputDirectory>
+                            <processor>com.querydsl.apt.QuerydslAnnotationProcessor</processor>
+                        </configuration>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>com.querydsl</groupId>
+                        <artifactId>querydsl-apt</artifactId>
+                        <version>${querydsl.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
         </plugins>
     </build>
 </project>

+ 15 - 0
src/main/java/in/ocsf/dialij/app/MapDB.java

@@ -0,0 +1,15 @@
+package in.ocsf.dialij.app;/* kpmy 17.03.2017 */
+
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MapDB {
+
+    @Bean
+    public DB memDb(){
+        return DBMaker.memoryDB().make();
+    }
+}

+ 9 - 0
src/main/java/in/ocsf/dialij/app/QueryDSL.java

@@ -0,0 +1,9 @@
+package in.ocsf.dialij.app;/* kpmy 17.03.2017 */
+
+import com.querydsl.collections.CollQueryFactory;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class QueryDSL {
+    public static final CollQueryFactory collectionQueryFactory = null;
+}

+ 48 - 17
src/main/java/in/ocsf/dialij/app/ctrl/DevController.java

@@ -4,6 +4,9 @@ import co.paralleluniverse.fibers.Fiber;
 import co.paralleluniverse.fibers.SuspendExecution;
 import in.ocsf.dialij.app.obj.Processor;
 import in.ocsf.dialij.app.srv.CompilerService;
+import in.ocsf.dialij.app.srv.PopulationService;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.log4j.Logger;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -11,6 +14,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.inject.Inject;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @RestController
 public class DevController {
@@ -18,24 +24,49 @@ public class DevController {
     @Inject
     private CompilerService compiler;
 
+    @Inject
+    private PopulationService population;
+
     private Logger log = Logger.getLogger(getClass());
 
-    @RequestMapping("/dev/bf")
-    public ResponseEntity<String> bf() {
-        Processor pr = compiler.compile("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++\n" +
-                " .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.\n" +
-                " ------.--------.>+.>.");
-
-        for (int i = 0; i < 10000; i++) {
-            new Fiber<String>() {
-                @Override
-                protected String run() throws SuspendExecution, InterruptedException {
-                    String out = pr.process();
-                    log.info(out);
-                    return out;
-                }
-            }.start();
-        }
-        return new ResponseEntity<>(HttpStatus.OK);
+    @RequestMapping("/dev/population/initial")
+    public ResponseEntity<String> initPopulation() throws Exception{
+        List<Fiber> alive = new ArrayList<>();
+
+        Map<UUID, String> code = population.getInitialPopulation();
+        code.forEach((k, v) -> {
+            alive.add(compiler.compile(v).setName(k.toString()).start());
+        });
+
+        List<Pair<UUID, Object>> procs = new Fiber<List<Pair<UUID, Object>>>(){
+            @Override
+            protected List<Pair<UUID, Object>> run() throws SuspendExecution, InterruptedException {
+                return (List) alive.parallelStream().map(c -> {
+                    try {
+                        return ImmutablePair.of(UUID.fromString(c.getName()), c.get());
+                    } catch (Exception e){
+                        return ImmutablePair.of(UUID.fromString(c.getName()), e);
+                    }
+                }).filter(o -> !(o.getValue() instanceof Throwable)).collect(Collectors.toList());
+            }
+        }.start().get();
+
+        procs.stream().forEach(p -> {
+            Processor processor = compiler.proxify(p.getValue());
+            try {
+                new Fiber<Void>() {
+                    @Override
+                    protected Void run() throws SuspendExecution, InterruptedException {
+                        log.info(code.get(p.getKey()));
+                        log.info(processor.process());
+                        return null;
+                    }
+                }.start().get(1, TimeUnit.SECONDS);
+            } catch (Exception e){
+                throw new RuntimeException(e);
+            }
+        });
+
+        return ResponseEntity.ok("ok");
     }
 }

+ 65 - 0
src/main/java/in/ocsf/dialij/app/obj/Codon.java

@@ -0,0 +1,65 @@
+package in.ocsf.dialij.app.obj;/* kpmy 17.03.2017 */
+
+import java.util.*;
+
+public class Codon implements CharSequence {
+    public static final List<Codon> ALL = new ArrayList<>();
+
+    private char[] inner;
+
+    @Override
+    public int length() {
+        return inner.length;
+    }
+
+    @Override
+    public char charAt(int i) {
+        return inner[i];
+    }
+
+    @Override
+    public CharSequence subSequence(int i, int i1) {
+        return String.valueOf(inner).subSequence(i, i1);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Codon codon = (Codon) o;
+
+        return new org.apache.commons.lang3.builder.EqualsBuilder()
+                .append(inner, codon.inner)
+                .isEquals();
+    }
+
+    @Override
+    public int hashCode() {
+        return new org.apache.commons.lang3.builder.HashCodeBuilder(17, 37)
+                .append(inner)
+                .toHashCode();
+    }
+
+    private Codon(){}
+
+    public Codon(char... c){
+        this.inner = c;
+    }
+
+    static {
+        List<Character> ca, cb, cc;
+        ca = cb = cc = Arrays.asList('+', '-', '<', '>', '[', ']', '.', ' ');
+        Set<Codon> cache = new HashSet<>();
+        for(Character a : ca) {
+            for (Character b : cb) {
+                for (Character c : cc) {
+                    Codon codon = new Codon(a, b, c);
+                    if(!cache.contains(codon)) ALL.add(codon);
+                    cache.add(codon);
+                }
+            }
+        }
+    }
+}

+ 37 - 15
src/main/java/in/ocsf/dialij/app/srv/CompilerService.java

@@ -1,5 +1,7 @@
 package in.ocsf.dialij.app.srv;/* kpmy 16.03.2017 */
 
+import co.paralleluniverse.fibers.Fiber;
+import co.paralleluniverse.fibers.SuspendExecution;
 import groovy.lang.GroovyShell;
 import in.ocsf.dialij.app.obj.Processor;
 import org.apache.log4j.Logger;
@@ -9,13 +11,38 @@ import java.io.StringReader;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
+import java.util.UUID;
 
 @Service
 public class CompilerService {
 
+    public static class CompileFiber extends Fiber<Object> {
+        private String source;
+
+        @Override
+        protected Object run() throws SuspendExecution, InterruptedException {
+            try {
+                BFctx ctx = new BFctx();
+                for (int i = 0; i < source.length(); i++)
+                    ctx.parse(source.charAt(i));
+
+                String code = ctx.close();
+                GroovyShell groovyShell = new GroovyShell();
+
+                return groovyShell.evaluate(new StringReader(code));
+            } catch (Exception e) {
+                return new RuntimeException(e);
+            }
+        }
+
+        private CompileFiber(String source){
+            this.source = source;
+        }
+    }
+
     private Logger log = Logger.getLogger(getClass());
 
-    private Processor proxify(Object obj) {
+    public Processor proxify(Object obj) {
         return (Processor) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                 new Class[]{Processor.class},
                 (proxy, method, args) -> {
@@ -30,23 +57,13 @@ public class CompilerService {
                 });
     }
 
-    public Processor compile(String source) {
-        BFctx ctx = new BFctx();
-        for (int i = 0; i < source.length(); i++)
-            ctx.parse(source.charAt(i));
-
-        String code = ctx.close();
-        GroovyShell groovyShell = new GroovyShell();
-        try {
-            Processor p = proxify(groovyShell.evaluate(new StringReader(code)));
-            return p;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+    public CompileFiber compile(String source) {
+        return new CompileFiber(source);
     }
 
-    private class BFctx {
+    private static class BFctx {
         private StringBuilder src = new StringBuilder();
+        private int balance;
 
         BFctx() {
             src.append("package groovy.in.ocsf.dialij.script;\n");
@@ -81,10 +98,15 @@ public class CompilerService {
                 case '[':
                     src.append("v = mem.get(p);\n");
                     src.append("while(v > 0){\n");
+                    balance++;
                     break;
                 case ']':
                     src.append("v = mem.get(p);\n");
                     src.append("}\n");
+                    if(balance >= 0)
+                        balance--;
+                    else
+                        throw new RuntimeException("unbalanced bf");
                     break;
                 case '>':
                     src.append("p++;\n");

+ 38 - 0
src/main/java/in/ocsf/dialij/app/srv/PopulationService.java

@@ -0,0 +1,38 @@
+package in.ocsf.dialij.app.srv;/* kpmy 17.03.2017 */
+
+import in.ocsf.dialij.app.obj.Codon;
+import org.apache.commons.math3.random.RandomDataGenerator;
+import org.apache.commons.math3.random.RandomGenerator;
+import org.mapdb.DB;
+import org.springframework.stereotype.Service;
+import org.uncommons.maths.random.GaussianGenerator;
+
+import javax.inject.Inject;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+
+@Service
+public class PopulationService {
+
+    @Inject
+    private DB mapDb;
+
+    private final GaussianGenerator mean = new GaussianGenerator(5.0d, 1.0d, new Random());
+    private final RandomDataGenerator rnd = new RandomDataGenerator();
+
+    public Map<UUID, String> getInitialPopulation(){
+        Map<UUID, String> population = (Map) mapDb.hashMap("population").createOrOpen();
+
+        for(int i = 0; i<1000; i++){
+            Long len = Math.round(mean.nextValue() * 10);
+            StringBuilder code = new StringBuilder();
+            for(int k = 0; k < len; k++){
+                int idx = rnd.nextInt(0, Codon.ALL.size() - 1);
+                code.append(Codon.ALL.get(idx));
+            }
+            population.put(UUID.randomUUID(), code.toString());
+        }
+        return  population;
+    }
+}

+ 1 - 0
src/main/resources/application.properties

@@ -0,0 +1 @@
+co.paralleluniverse.fibers.detectRunawayFibers=false